Android UI控制元件系列:Dialog(對話方塊)

apkbus發表於2014-12-03

對話方塊是Android中不可或缺的,在使用對話方塊的時候,需要使用AlertDialog.Builder類。當然處理系統預設的對話方塊外,還可以自定義對話方塊,如果對話方塊設定了按鈕,那麼要對其進行事件監聽OnClickListener。

下面的是一個用AlertDialog.Builder類和自定義的對話方塊的例項,當點選確定時,轉移到登陸對話方塊,當輸入使用者名稱和密碼後,轉移到登陸進度對話方塊

這裡的自定義對話方塊是由兩個TextView和兩個EditText組成,也就是那個登入對話方塊,自定義對話方塊的佈局檔案是dialog.xml檔案,見下面

另外呢,使用AlertDialog來建立對話方塊,需要了解一下幾個方法

setTitle();給對話方塊設定標題
setIcon();給對話方塊設定圖示
setMessage();設定對話方塊的提示資訊
setItems();設定對話方塊要顯示的一個list,一般用於顯示幾個命令時
setSingleChoiceItems();設定對話方塊顯示一個單選的List
setMultiChoiceItems();設定對話方塊顯示一系列的核取方塊
setPositiveButton();給對話方塊新增”yes”按鈕
setNegativeButton();給對話方塊新增”no”按鈕

DialogTest.java

package org.hualang.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

public class DialogTest extends Activity {
    /** Called when the activity is first created. */
        ProgressDialog mydialog;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Dialog dialog=new AlertDialog.Builder(DialogTest.this)
        .setTitle("登入提示")//設定標題
        .setMessage("這裡需要登入")//設定對話方塊顯示內容
        .setPositiveButton("確定", //設定確定按鈕
        new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                //點選確定轉向登入對話方塊
                                LayoutInflater factory=LayoutInflater.from(DialogTest.this);
                                //得到自定義對話方塊
                                final View DialogView=factory.inflate(R.layout.dialog, null);
                                //建立對話方塊
                                AlertDialog dlg=new AlertDialog.Builder(DialogTest.this)
                                .setTitle("登入框")
                                .setView(DialogView)//設定自定義對話方塊樣式
                                .setPositiveButton("確定",
                                new DialogInterface.OnClickListener() {//設定監聽事件

                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                                // 輸入完成後點選“確定”開始登入
                                                mydialog=ProgressDialog.show(DialogTest.this, "請稍等...", "正在登入...",true);
                                                new Thread()
                                                {
                                                        public void run()
                                                        {
                                                                try
                                                                {
                                                                        sleep(3000);
                                                                }catch(Exception e)
                                                                {
                                                                        e.printStackTrace();
                                                                }finally
                                                                {
                                                                        //登入結束,取消mydialog對話方塊
                                                                        mydialog.dismiss();
                                                                }
                                                        }
                                                }.start();
                                        }
                                }).setNegativeButton("取消",//設定取消按鈕
                                        new DialogInterface.OnClickListener() {

                                                @Override
                                                public void onClick(DialogInterface dialog, int which) {
                                                        //點選取消後退出程式
                                                        DialogTest.this.finish();

                                                }
                                        }).create();//建立對話方塊
                                dlg.show();//顯示對話方塊
                        }
                }).setNeutralButton("退出",
                        new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                        // 點選退出後退出程式
                                        DialogTest.this.finish();
                                }
                        }).create();//建立按鈕
        //顯示對話方塊
        dialog.show();
    }
}

dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
        android:id="@+id/username"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dip"
    android:layout_marginRight="20dip"
    android:text="使用者名稱"
    android:gravity="left"
    android:textAppearance="?android:attr/textAppearanceMedium"
    />
<EditText
        android:id="@+id/username"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:scrollHorizontally="true"
        android:autoText="false"
        android:capitalize="none"
        android:gravity="fill_horizontal"
        android:textAppearance="?android:attr/textAppearanceMedium"
/>
<TextView
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:text="密碼"
        android:gravity="left"
        android:textAppearance="?android:attr/textAppearanceMedium"
/>
<EditText
        android:id="@+id/password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:scrollHorizontally="true"
        android:autoText="false"
        android:capitalize="none"
        android:gravity="fill_horizontal"
        android:password="true"
        android:textAppearance="?android:attr/textAppearanceMedium"

/>
</LinearLayout>

執行結果如下:

點選確定後,會跳轉到登陸對話方塊,這個登入對話方塊是自定義的對話方塊

輸入使用者名稱和密碼後,點選確定後,進入帶進度條的對話方塊中,這裡的帶進度條的對話方塊是系統預設的,並且用現成控制,3秒後就結束該對話方塊,並跳轉到相應的Activity中

補充內容:

1、Inflater英文意思是膨脹,在android中是擴充套件的意思。

LayoutInflater的作用類似於 findViewById(),不同點是LayoutInflater是用來找layout資料夾下的xml佈局檔案,並且例項化!而 findViewById()是找具體某一個xml下的具體 widget控制元件(如:Button,TextView等)。 它可以有很多地方可以使用,如BaseAdapter的getView中,自定義Dialog中取得view中的元件widget等等。

2、AlertDialog.Builder是警告對話方塊的意思

3、單位

px:是螢幕的畫素點
in:英寸
mm:毫米
pt:磅,1/72 英寸
dp:一個基於density的抽象單位,如果一個160dpi的螢幕,1dp=1px
dip:等同於dp
sp:同dp相似,但還會根據使用者的字型大小偏好來縮放。

建議使用sp作為文字的單位,其它用dip

4、dialog.xml說明

①android:layout_marginLeft=”20dip”
margin是邊的意思,上面這句話是說該控制元件距離左邊20個dip。同樣
android:layout_marginRight=”20dip”就是該控制元件距離父控制元件右邊20dip

②android:gravity=”left”:表示該控制元件的text文字顯示在左邊

③android:layout_gravity=”center”:表示該控制元件位於父控制元件的中間

④android:textAppearance的使用

對於能夠顯示文字的控制元件(如TextView EditText RadioButton Button CheckBox等),你有時需要控制字型的大小。Android平臺定義了三種字型大小。

“?android:attr/textAppearanceLarge”
“?android:attr/textAppearanceMedium”
“?android:attr/textAppearanceSmall”
使用方法為:
android:textAppearance=”?android:attr/textAppearanceLarge”
android:textAppearance=”?android:attr/textAppearanceMedium”
android:textAppearance=”?android:attr/textAppearanceSmall”

style=”?android:attr/textAppearanceLarge”
style=”?android:attr/textAppearanceMedium”
style=”?android:attr/textAppearanceSmall”

⑤ android:scrollHorizontally=”true”:設定文字超出TextView的寬度的情況下,是否出現橫拉條

⑥android:autoText=”false”:如果設定,將自動執行輸入值的拼寫糾正。此處無效果,在顯示輸入法並輸入的時候起作用。此處設定為false,則為關閉子動能

⑦android:capitalize=”none”:設定英文字母大寫型別。此處無效果,需要彈出輸入法才能看得到

⑧android:password=”true”:以小點”.”顯示文字,用於輸入密碼時

相關文章