2015年3月8日 星期日

Android控制項Dialog

對話框,所有應用程式或系統程式要回應使用者的主要方式,好的對話框可以讓使用者非常清楚應用程式目前狀態。

重點
建議在設計應用程式之初,獨立一個資料夾去設計並且加入對話框,每個地方需要使用到對話框的時候乎叫共同的程式碼,如此一來整個應用程式有統一的對話架構。

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="基本對話框"
            android:id="@+id/btn_SimpleDialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="擁有兩個Button的對話框"
            android:id="@+id/btn_DoubleDialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="擁有三個Button的對話框"
            android:id="@+id/btn_Tripleialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="進行登入驗證的對話框"
            android:id="@+id/btn_AuthenticationDialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="顯是進度的對話框 "
            android:id="@+id/btn_ProgressDialog" />
    </LinearLayout>
</RelativeLayout>


authentication_dialog
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="登入帳號"
            android:id="@+id/username_view" />

        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="Name"
            android:ems="10"
            android:id="@+id/username_edit" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="登入密碼"
            android:id="@+id/password_view" />

        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="Name"
            android:ems="10"
            android:id="@+id/password_edit" />

    </LinearLayout>
</LinearLayout>

string.xml
<resources>
    <string name="app_name">Dialog</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="alert_simple_dialog_title">這是個提示框。請按確定返回</string>
    <string name="alert_double_dialog_title">這是個提示框。請任點選下列按鈕返回</string>
    <string name="alert_double_dialog_message">是否退出遊戲</string>
    <string name="alert_double_dialog_context">確定要退出遊戲請點選確定按鈕。如果要繼續遊戲請點選取消按鈕。如果想要了解最高分可以點選最高紀錄按鈕</string>
    <string name="alert_double_dialog_ok">確定</string>
    <string name="alert_double_dialog_hide">隱藏</string>
    <string name="alert_double_dialog_something">最高紀錄</string>
    <string name="alert_double_dialog_cancel">取消</string>
    <string name="alert_double_dialog_entry">請輸入</string>
</resources>

MainActivity.java
package com.example.win7.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity {
    /*設定5個int來作為五個對話框識別,使用Menu來產生*/
    private static final int Dialog1 = Menu.FIRST;
    private static final int Dialog2 = Menu.FIRST+1;
    private static final int Dialog3 = Menu.FIRST+2;
    private static final int Dialog4 = Menu.FIRST+3;
    private static final int Dialog5 = Menu.FIRST+4;
    private Button btn_SimpleDialog,btn_DoubleDialog,btn_Tripleialog,btn_AuthenticationDialog,btn_ProgressDialog;
    private AlertDialog.Builder alb_SimpleDialog;
    private AlertDialog.Builder alb_DoubleDialog;
    private AlertDialog.Builder alb_Tripleialog;
    private AlertDialog.Builder alb_AuthenticationDialog;
    private LayoutInflater lai_AuthenticationDialog;
    private ProgressDialog prd_ProgressDialog;
    /*覆寫Activity的onCreateDialog方法,當成是執行到Activity的showDialog()方法時
    * onCreateDialog()方法會自動乎叫並且傳入id*/
    protected Dialog onCreateDialog(int id){
        switch (id){
            case Dialog1:
                setTitle("目前點選是:基本對話框");
            /*呼叫BuildDialog()方法來建立對話框*/
                return BuildDialog1(MainActivity.this);
            case Dialog2:
                setTitle("目前點選是:擁有兩個Button的對話框");
                return BuildDialog2(MainActivity.this);
            case Dialog3:
                setTitle("目前點選是:擁有三個Button的對話框");
                return BuildDialog3(MainActivity.this);
            case Dialog4:
                setTitle("目前點選是:進行登入對話框");
                return BuildDialog4(MainActivity.this);
            case Dialog5:
                setTitle("目前點選是:顯示進度");
                return BuildDialog5(MainActivity.this);
        }
        return null;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*showDialog()方法建立對話框視窗*/
        setupViewComponent();
     }
    private void setupViewComponent(){
        btn_SimpleDialog=(Button)findViewById(R.id.btn_SimpleDialog);
        btn_SimpleDialog.setOnClickListener(Go_SimpleDialog);

        btn_DoubleDialog=(Button)findViewById(R.id.btn_DoubleDialog);
        btn_DoubleDialog.setOnClickListener(Go_DoubleDialog);

        btn_Tripleialog=(Button)findViewById(R.id.btn_Tripleialog);
        btn_Tripleialog.setOnClickListener(Go_Tripleialog);

        btn_AuthenticationDialog=(Button)findViewById(R.id.btn_AuthenticationDialog);
        btn_AuthenticationDialog.setOnClickListener(Go_AuthenticationDialog);

        btn_ProgressDialog=(Button)findViewById(R.id.btn_ProgressDialog);
        btn_ProgressDialog.setOnClickListener(Go_ProgressDialog);
    }
    private Button.OnClickListener Go_SimpleDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog1);
        }
    };

    private Button.OnClickListener Go_DoubleDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog2);
        }
    };

    private Button.OnClickListener Go_Tripleialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog3);
        }
    };

    private Button.OnClickListener Go_AuthenticationDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog4);
        }
    };

    private Button.OnClickListener Go_ProgressDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog5);
        }
    };
    private Dialog BuildDialog1(Context context){
        /*呼叫AlertDialog.Builder()方法建立對話視窗*/
        alb_SimpleDialog = new AlertDialog.Builder(context);
        alb_SimpleDialog.setTitle(R.string.alert_simple_dialog_title);
        alb_SimpleDialog.setIcon(R.mipmap.ic_launcher);
        /*在基本對話框上面配置確定按鈕*/
        alb_SimpleDialog.setPositiveButton(R.string.alert_double_dialog_ok,
            new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog,int whichButton){
                setTitle("點選了基本對話框的確定鍵");
            }
        });
        /*呼叫create()方法將使得對話框實體被建立出來,但是要直到呼叫show()或者showDialog()方法,該對話框式視窗才會顯示出來*/
        return alb_SimpleDialog.create();
    }

    private Dialog BuildDialog2(Context context){
        alb_DoubleDialog = new AlertDialog.Builder(context);
        alb_DoubleDialog.setTitle(R.string.alert_double_dialog_title);
        alb_DoubleDialog.setIcon(R.mipmap.ic_launcher);
        alb_DoubleDialog.setPositiveButton(R.string.alert_double_dialog_ok,
                new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog,int whichButton){
                        setTitle("點選了有兩個對話框的確定鍵");
                    }
                });
        alb_DoubleDialog.setNegativeButton(R.string.alert_double_dialog_cancel,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了有兩個對話框的取消鍵");
                    }
                } );
        return alb_DoubleDialog.create();
    }

    private Dialog BuildDialog3(Context context){
        alb_Tripleialog = new AlertDialog.Builder(context);
        alb_Tripleialog.setTitle(R.string.alert_double_dialog_message);
        alb_Tripleialog.setMessage(R.string.alert_double_dialog_context);
        alb_Tripleialog.setIcon(R.mipmap.ic_launcher);
        alb_Tripleialog.setPositiveButton(R.string.alert_double_dialog_ok,
                new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog,int whichButton){
                        setTitle("點選了有三個對話框的確定鍵");
                    }
                });
        alb_Tripleialog.setNeutralButton(R.string.alert_double_dialog_something,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了有三個對話框的最高分數鍵");
                    }
                } );
        alb_Tripleialog.setNegativeButton(R.string.alert_double_dialog_cancel,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了有三個對話框的取消鍵");
                    }
                } );
        return alb_Tripleialog.create();
    }

    private Dialog BuildDialog4(Context context){
        lai_AuthenticationDialog = LayoutInflater.from(this);
        final View textEntryView = lai_AuthenticationDialog.inflate(
                R.layout.authentication_dialog,null);

        alb_AuthenticationDialog = new AlertDialog.Builder(context);
        alb_AuthenticationDialog.setTitle(R.string.alert_double_dialog_entry);
        alb_AuthenticationDialog.setIcon(R.mipmap.ic_launcher);

        alb_AuthenticationDialog.setView(textEntryView);

        alb_AuthenticationDialog.setPositiveButton(R.string.alert_double_dialog_ok,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了驗證框的確定鍵");
                    }
                });
        alb_AuthenticationDialog.setNegativeButton(R.string.alert_double_dialog_cancel,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了驗證框的取消鍵");
                    }
                });
        return alb_AuthenticationDialog.create();
    }

    private Dialog BuildDialog5(Context context){
        prd_ProgressDialog = new ProgressDialog(context);
        prd_ProgressDialog.setTitle("資料處理中");
        prd_ProgressDialog.setMessage("請稍候....");

        return prd_ProgressDialog;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

沒有留言:

張貼留言