鍍金池/ 教程/ Android/ Android 實戰(zhàn)簡易教程-第六槍(各種對話框 Dialog 用法研究大全)
Android 實戰(zhàn)簡易教程-第九槍(BitmapFactory.Options 對資源圖片進(jìn)行縮放)
Android 實戰(zhàn)簡易教程-第三槍(實現(xiàn)簡單繪圖組件)
Android 用的最多的,也最難用的應(yīng)該就是 ListView 了,下面我們研究一下它的用法。
Android 實戰(zhàn)簡易教程-第四槍(ScrollView 和 HorizontalScrollView 動態(tài)添加控件并提供事件
Android 實戰(zhàn)簡易教程-第一槍(Spinner 控件詳解)
Android 實戰(zhàn)簡易教程-第六槍(各種對話框 Dialog 用法研究大全)
Android 實戰(zhàn)簡易教程-第七槍(Activity 的啟動模式)
Android 實戰(zhàn)簡易教程-第二槍(Spinner 下拉級聯(lián)效果)
Android 實戰(zhàn)簡易教程-第八槍(ImageSwitcher 用法實例)
Android 實戰(zhàn)簡易教程-第十槍(畫廊組件 Gallery 實用研究)
作者簡介

Android 實戰(zhàn)簡易教程-第六槍(各種對話框 Dialog 用法研究大全)

在圖形界面中,對話框也是人機(jī)交互的一種重要形式,程序可以通過對話框進(jìn)行一些信息的提示,而用戶也可以通過對話框和程序進(jìn)行一些簡單的交互操作。

在 Android 中,所有的對話框都是從 android.app.Dialog 類繼承而來的,此類的繼承結(jié)構(gòu)如下:

java.lang.Object
   android.app.Dialog

可以發(fā)現(xiàn)此類直接繼承自 Object 類,與 View 類沒有任何繼承關(guān)系。

一、AlertDialog 和 AlertDialog.Builder

警告框(AlertDialog)是項目中最常見的對話框形式,是 Dialog 的直接子類。

如果想要實例化 AlertDialog 類,往往需要依靠其內(nèi)部類 AlertDialog.Builder 類完成。

下面通過一個最常見的返回鍵提示退出功能來演示一下其用法。

  1. 布局文件 main.xml,我們只要研究返回鍵,所以布局文件可以不設(shè)置任何控件。

  2. MainActivity.java:
package org.yayun.demo;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View.OnKeyListener;

public class MainActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // 生命周期方法
        super.setContentView(R.layout.main); // 設(shè)置要使用的布局管理器

    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK){
            this.exitDialog();
        }
        return super.onKeyDown(keyCode, event);
    }
    private void exitDialog() {
        Dialog dialog=new AlertDialog.Builder(this).setTitle("程序退出?").setMessage("確定退出嗎?").setPositiveButton("退出", new OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                MainActivity.this.finish();

            }
        }).setNegativeButton("取消", new OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        }).create();//創(chuàng)建Dialog
        dialog.show();//顯示對話框

    }
}

運行實例如下:

http://wiki.jikexueyuan.com/project/android-in-action/images/14.png" alt="" />

這屬于比較簡單的應(yīng)用,但是在實際開發(fā)中用到比較多。

二、類似 ListView 的顯示風(fēng)格的選項列表

這種顯示風(fēng)格要用到 setSingleChoiceItems() 方法;

1.main.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/mych"
        android:text=""
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/mytext"
        android:text=""
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button 
        android:id="@+id/mybut"
        android:text="選擇水果"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>
</LinearLayout> 

2.MainActivity.java 如下:

package org.lxh.demo;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MyDialogDemo extends Activity {
    private Button mybut = null ;   // 定義按鈕
    private TextView mych = null ;  // 定義文本
    private TextView mytext = null ;    // 定義文本
    private String fruitData [] = new String[] { "蘋果", "西瓜", "水蜜桃" };
    private String fruitDesc [] = new String[] {
            "蘋果,植物類水果,多次花果,具有豐富的營養(yǎng)成分,有食療、輔助治療等功能。",
            "西瓜(學(xué)名:Citrullus Lanatus,英文:Watermelon),屬葫蘆科,原產(chǎn)于非洲。",
            "水蜜桃,在植物分類學(xué)上屬于薔薇科,梅屬,桃亞屬,為落葉小喬木。"} ;
    private int chNum = 0 ; // 保存選項
    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main); // 調(diào)用布局管理器
        this.mybut = (Button) super.findViewById(R.id.mybut) ;  // 取得按鈕
        this.mych = (TextView) super.findViewById(R.id.mych) ;  // 取得文本
        this.mytext = (TextView) super.findViewById(R.id.mytext) ;  // 取得文本
        this.mybut.setOnClickListener(new OnClickListenerImpl()) ;  // 設(shè)置事件類
    }
    private class OnClickListenerImpl implements OnClickListener {

        @Override
        public void onClick(View view) {
            Dialog dialog = new AlertDialog.Builder(MyDialogDemo.this)
                .setIcon(R.drawable.pic_m) 
                .setTitle("請選擇你喜歡吃的水果?")
                .setPositiveButton("確定", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                                    MyDialogDemo.this.mych
                                            .setText(MyDialogDemo.this.fruitData[MyDialogDemo.this.chNum]); // 設(shè)置選項的名稱
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                }).setSingleChoiceItems(MyDialogDemo.this.fruitData, 0, new DialogInterface.OnClickListener() {//setSingleChoiceItems()方法
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                                    MyDialogDemo.this.mytext
                                            .setText(MyDialogDemo.this.fruitDesc[which]);
                                    MyDialogDemo.this.chNum = which ;   // 保存選項的索引
                    }
                }).create() ;
            dialog.show() ;
        }

    }

}

運行實例:

http://wiki.jikexueyuan.com/project/android-in-action/images/15.png" alt="" />

http://wiki.jikexueyuan.com/project/android-in-action/images/16.png" alt="" />

三、定制對話框和 LayoutInflater

之前的對話框都是直接通過 Activity 程序進(jìn)行定義的,但是如果希望在對話框中顯示一些復(fù)雜的界面,例如編寫一個登陸提示對話框,就需要通過布局文件定義顯示組件,之后再將這些布局顯示包含到對話框中,而如果想要包含,則需要 LayoutInflater 類的支持。

1.定義布局管理器 main.xml:

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

    <Button
        android:id="@+id/mybut"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="登錄" />

</LinearLayout>

2.定義對話框所需的布局管理器 login.xml:

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

<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
     <TextView

        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="用戶名:" />
      <EditText
        android:id="@+id/edit_user"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="88"
        android:text="yayun" />

</LinearLayout>
<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
     <TextView

        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="密碼:" />
      <EditText
        android:id="@+id/edit_passwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="88"
        android:password="true"
        android:text="123456" />

</LinearLayout>

</LinearLayout>

3.定義 MainActivity.java:

package org.lxh.demo;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MyDialogDemo extends Activity {
    private Button btn;
    String string_userString;
    String string_passwdString;

    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main); // 調(diào)用布局管理器
        btn=(Button)findViewById(R.id.mybut);
        btn.setOnClickListener(new OnClickListenerImpl());      
    }
    private class OnClickListenerImpl implements OnClickListener{

        @Override
        public void onClick(View v) {
            LayoutInflater layoutInflater=LayoutInflater.from(MyDialogDemo.this);//獲得layoutInflater對象
            View view=layoutInflater.from(MyDialogDemo.this).inflate(R.layout.login, null);//獲得view對象
            EditText edit_user=(EditText)view.findViewById(R.id.edit_user);//獲取控件
            EditText edit_passwd=(EditText)view.findViewById(R.id.edit_passwd);
             string_userString=edit_user.getText().toString();
             string_passwdString=edit_passwd.getText().toString();
            Dialog dialog=new AlertDialog.Builder(MyDialogDemo.this).setTitle("用戶登錄").setView(view).setPositiveButton("登錄", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    if(string_userString.equals("yayun")&&string_passwdString.equals("123456")){
                        Toast.makeText(MyDialogDemo.this, "登錄成功", Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(MyDialogDemo.this, "登錄失敗", Toast.LENGTH_SHORT).show();
                    }

                }
            }).setNegativeButton("取消", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub

                }
            }).create();
            dialog.show();
        }

    }

}

4.運行實例:

http://wiki.jikexueyuan.com/project/android-in-action/images/17.png" alt="" />

http://wiki.jikexueyuan.com/project/android-in-action/images/18.png" alt="" />

四、日期對話框(DatePickerDialog)和時間對話框(TimePickerDialog)

主要進(jìn)行日期和時間的設(shè)置。

1.main.xml 代碼如下:

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

    <Button
        android:id="@+id/mybut"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="設(shè)置日期" />
    <Button
        android:id="@+id/mytext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />

</LinearLayout>

2.MainActivity.java 代碼如下:

package org.lxh.demo;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

public class MyDialogDemo extends Activity {
    private Button btn;
    private TextView textView;

    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main); // 調(diào)用布局管理器
        btn=(Button)findViewById(R.id.mybut);
        textView=(TextView)findViewById(R.id.mytext);
        btn.setOnClickListener(new OnClickListenerImpl());      
    }
    private class OnClickListenerImpl implements OnClickListener{

        @Override
        public void onClick(View v) {
            Dialog dialog=new DatePickerDialog(MyDialogDemo.this, new DatePickerDialog.OnDateSetListener() {

                @Override
                public void onDateSet(DatePicker view, int year, int monthOfYear,
                        int dayOfMonth) {
                    textView.setText("更新日期為:"+year+"年-"+(monthOfYear+1)+"月-"+dayOfMonth+"日");

                }
            }, 1990, 04, 01);
            dialog.show();

        }

    }

}

運行實例:

http://wiki.jikexueyuan.com/project/android-in-action/images/19.png" alt="" />

http://wiki.jikexueyuan.com/project/android-in-action/images/20.png" alt="" />

TimePickerDialog 對話框和 DatePickerDialog 對話框基本一樣。

五、進(jìn)度條對話框

先看一個簡單的圈形進(jìn)度處理對話框,這個在開發(fā)中也十分常見,常用于登錄等待、網(wǎng)絡(luò)連接等待、數(shù)據(jù)刷新等待等,可以增加用戶友好度。

1.main.xml 代碼如下:

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

    <Button
        android:id="@+id/mybut"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="查找網(wǎng)絡(luò)" />

</LinearLayout>

2.MainActivity.java 代碼如下:

package org.lxh.demo;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

public class MyDialogDemo extends Activity {
    private Button btn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main); // 調(diào)用布局管理器
        btn = (Button) findViewById(R.id.mybut);
        btn.setOnClickListener(new OnClickListenerImpl());
    }

    private class OnClickListenerImpl implements OnClickListener {
        @Override
        public void onClick(View v) {
            final ProgressDialog dialog = ProgressDialog.show(
                    MyDialogDemo.this, "請搜索網(wǎng)絡(luò)...", "請耐心等待...");// 之所以用final定義,主要目的是為了讓內(nèi)部類可以訪問方法中定義的參數(shù)。
            new Thread() {
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } finally {
                        dialog.dismiss();
                    }
                };
            }.start();

        }

    }

}

運行實例:

三秒鐘后對話框會自動消失!

在默認(rèn)情況下,進(jìn)度對話框采用的是環(huán)形進(jìn)度條(STYLE_SPINNER)的顯示風(fēng)格,用戶也可以根據(jù)需要將進(jìn)度條設(shè)置為水平(STYLE_HORIZONTAL)顯示風(fēng)格。

1.main.xml 代碼:

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

    <Button
        android:id="@+id/mybut"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="查找網(wǎng)絡(luò)" />

</LinearLayout>

2.MainActivity.java 代碼如下:

package org.lxh.demo;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MyDialogDemo extends Activity {
    private Button btn;
    private static final int MAX_PROGRESS=100;//總進(jìn)度值

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main); // 調(diào)用布局管理器
        btn = (Button) findViewById(R.id.mybut);
        btn.setOnClickListener(new OnClickListenerImpl());
    }

    private class OnClickListenerImpl implements OnClickListener {
        @Override
        public void onClick(View v) {
            final ProgressDialog dialog=new ProgressDialog(MyDialogDemo.this);
            dialog.setTitle("搜索網(wǎng)絡(luò)...");
            dialog.setMessage("正在搜索,請耐心等待...");
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//顯示樣式,水平顯示
            dialog.setMax(MAX_PROGRESS);
            dialog.setProgress(30);//初始位置
            dialog.setButton("后臺處理", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            });
            dialog.setButton2("詳細(xì)信息", new DialogInterface.OnClickListener() {//注意Button2!!

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub

                }
            });
            dialog.onStart();//啟動進(jìn)度條
            dialog.show();
            new Thread(){
                public void run() {
                    for (int i = 0; i <MAX_PROGRESS; i++) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        dialog.incrementProgressBy(1);//自增長1,重要!
                    }
                    dialog.dismiss();
                };
            }.start();

        }

    }

}

運行如下:

http://wiki.jikexueyuan.com/project/android-in-action/images/21.png" alt="" />

總結(jié)

  1. 如果想要實例化 AlertDialog 類,往往需要依靠其內(nèi)部類 AlertDialog.Builder 類完成;
  2. 判斷是否是返回鍵:keyCode==KeyEvent.KEYCODE_BACK;
  3. setSingleChoiceItems() 方法的使用;
  4. LayoutInflater 類引入布局文件,LayoutInflater layoutInflater=LayoutInflater.from(MyDialogDemo.this);//獲得 layoutInflater 對象 View view=layoutInflater.from(MyDialogDemo.this).inflate(R.layout.login, null);//獲得 view 對象;
  5. Dialog 的setView()方法,設(shè)置顯示布局;
  6. 日期對話框(DatePickerDialog)和時間對話框(TimePickerDialog);
  7. ProgressDialog的setProgressStyle()方法設(shè)置等待對話框顯示樣式,incrementProgressBy()啟動自增長。