Dialoghtml
Dialog,對話框,一個對話框就是一個小窗口,並不會填滿整個屏幕,一般是以模態顯示,要求用戶必須採起行動才能繼續進行剩下的操做。java
Android提供了豐富的對話框支持,它提供了以下4中經常使用的對話框:android
全部的對話框,都是直接或間接繼承自Dialog類,而AlterDialog直接繼承自Dialog,其餘的幾個類均繼承自AlterDialog。數組
AlertDialogapp
AlertDialog繼承自Dialog類,對於Android內置的AlterDialog,它能夠包含一個標題、一個內容消息或者一個選擇列表、最多三個按鈕。而建立AlterDialog推薦使用它的一個內部類AlterDialog.Builder建立。使用Builder對象,能夠設置AlterDialog的各類屬性,最後經過Builder.create()就能夠獲得AlterDialog對象,若是隻是還須要顯示這個AlterDialog,通常能夠直接使用Builder.show()方法,它會返回一個AlterDialog對象,而且顯示它。ide
若是僅僅是須要提示一段信息給用戶,那麼就能夠直接使用AlterDialog的一些屬性設置提示信息,涉及到的方法有:函數
Tips:AlterDialog.Builder的不少設置屬性的方法,返回的均是這個AlterDialog.Builder對象,因此可使用鏈式方式編寫代碼,這樣更方便。佈局
當一個對話框調用了show()方法後,展現到屏幕上,若是須要消除它,可使用DialogInterface接口聲明的兩個方法,cancel()和dismiss()使對話框取或者消除,這兩個方法的做用是同樣的,不過推薦使用dismiss()。Dialog和AlterDialog都實現了DialogInterface接口,因此只要是對話框,都可以使用這兩個方法來消除對話框。ui
AlterDialog的按鈕this
AlterDialog內置了三個按鈕,能夠直接使用setXxxButton()方法進行設置,對於通常的對話框,使用三個按鈕基本上也夠用了,下面是這三個方法的簽名:
上面介紹的DialogInterface接口,還提供了一系列的事件響應,這三個按鈕均須要傳遞一個DialogInterFace.OnClickListener接口對象,實現其點擊事件的觸發,在這個接口中須要實現一個onClick(DialogInterface dialog,int which),dialog爲當前觸發事件的對話框對象接口,能夠直接強制轉換爲AlterDialog進行操做;which爲點擊按鈕的標識符,是一個整形的數據,對於這三個按鈕而言,每一個按鈕使用不一樣的int類型數據進行標識:Positive(-1)、Negative(-2)、Neutral(-3)。
而除了專門爲按鈕點擊實現的DialogInterFace.OnClickListener事件外,DialogInterface還提供了一些其餘的事件,供Dialog對象響應,這些事件只是對Dialog聲明週期各個狀態的響應,一看就明白了,就再也不詳細講解了,下面是這幾個事件的說明:
示例:
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("提示"); builder.setMessage("你肯定要刪除嗎?"); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "肯定被點擊", Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "取消被點擊", Toast.LENGTH_SHORT).show(); } }); builder.setNeutralButton("忽略", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "忽略被點擊", Toast.LENGTH_SHORT).show(); } }); builder.setIcon(R.drawable.ic_launcher); AlertDialog alertDialog = builder.create(); alertDialog.show(); } });
效果:
AlterDialog的列表形式
AlterDialog除了展現一些提示信息,還能夠展現一種列表的形式,須要使用到Builder.setItems(CharSequence[] items,DialogInterface.OnClickListener listener)方法進行設置,它須要傳遞一個CharSequenece類型的數組,以綁定列表的數據,它一樣須要傳遞一個DialogInterface.OnClickListener接口,以響應列表項的點擊,而這個接口中onClick方法的which參數,爲當前點擊觸發項的items中的下標。
示例:
button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("請選擇如下城市"); // builder.setMessage("請選擇如下城市");//不能設置message的內容 builder.setItems(items, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub String select_item = items[which].toString(); Toast.makeText(MainActivity.this, "選擇了-->>" + select_item, Toast.LENGTH_SHORT) .show(); } }); AlertDialog dialog = builder.create(); dialog.show(); } });
效果:
AlterDialog的單選列表
AlterDialog還可使用一種單選的列表樣式,使用Builder.setSingleChoiceItems(CharSequenece[] items,int checkedItem,DialogInterface.OnClickListener listener),這個方法具備多項重載,主要是爲了應對不一樣的數據源,items爲列表項數組,checkedItem爲初始選項,listener爲點擊響應事件。有時候並不必定須要選中以後就關閉對話框,能夠設置兩個按鈕,用於肯定選擇。
示例:
button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("請選擇如下城市"); builder.setSingleChoiceItems(items, -1, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub String select_item = items[which].toString(); Toast.makeText(MainActivity.this, "選擇了-->>" + select_item, Toast.LENGTH_SHORT) .show(); } }); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); AlertDialog dialog = builder.create(); dialog.show(); } });
效果:
AlterDialog多選列表
AlterDialog除了單選列表,還有多選的列表。可使用Builder.setMultiChoiceItems(CharSequence[] items,boolean[] checkedItems,DialogInterface.OnMultiChoiceClickListener listener),這個方法也一樣具備多樣重載,對於這個方法,items以一個數組爲數據源;checkedItems是默認的選項,由於是多選列表,因此若是設置須要所有設置,若是沒有默認選中,則傳Null;listener爲多選項點擊觸發事件。
示例:
button4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("請選擇如下城市"); builder.setMultiChoiceItems(items, new boolean[] { false, false, false }, new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // TODO Auto-generated method stub String select_item = items[which].toString(); Toast.makeText(MainActivity.this, "選擇了-->>" + select_item, Toast.LENGTH_SHORT) .show(); } }); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); AlertDialog dialog = builder.create(); dialog.show(); } });
效果:
ProgressDialog
有些時候,只是須要提示用戶等待,好比在執行耗時操做等的時候,可使用進度對話框來顯示一個進度信息,提示用戶等待,這個時候可使用ProgressDialog。ProgressDialog的使用方式大部分能夠參見ProgressBar,其實就是一個封裝了ProgressBar的對話框。
ProgressDialog有兩種顯示方式,一種是以一個滾動的環狀圖標,能夠顯示一個標題和一段文本內容的等待對話框;另一種是帶刻度的進度條,和常規的進度條用法一致。兩種樣式經過ProgressDialog.setProgressStyle(int style)設置,能夠經過ProgressDialog的兩個常量進行設置:STYLE_HORIZONTAL:刻度滾動;STYLE_SPINNER:圖標滾動,默認選項。
對於圖標滾動,可使用兩種方式實現,一種是常規的調用構造函數,再設置對應的屬性;另一種是直接使用ProgressDialog的靜態方法show(),直接返回一個ProgressDialog對象,而且調用show()方法。
示例一:
button5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 第一種方法,使用ProgressDialog構造函數 ProgressDialog dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("等待"); dialog.setMessage("正在加載"); dialog.show(); // 第二種方法,使用靜態的show方法 // ProgressDialog.show(MainActivity.this, "等待", "正在加載....", // false,false); } });
效果:
示例二:
button6.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 第一種方式 // ProgressDialog dialog = new ProgressDialog(MainActivity.this, // ProgressDialog.STYLE_HORIZONTAL); ProgressDialog dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("下載提示"); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setMax(100); dialog.setProgress(20); dialog.show(); } });
效果:
AlertDialog自定義樣式
有些時候,Android自帶的一些樣式設置已經沒法知足需求了,那麼可使用自定義樣式,自定義個XML佈局文件,用這個文件的內容做爲AlertDialog的樣式展現在屏幕上,這樣就能夠靈活定製對話框了。對於定製的XML文件,可使用LayoutInflater.from(Context).inflate(int,ViewGroup)的方式對其進行動態加載,而後使用Builder.setView(View)把加載的視圖與Builder對象進行關聯,最後正常show()便可。
新建佈局文件(引用子官方文檔):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:layout_width="match_parent" android:layout_height="64dp" android:background="#FFFFBB33" android:contentDescription="@string/app_name" android:scaleType="center" android:src="@drawable/ic_launcher" /> <EditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_marginTop="16dp" android:hint="username" android:inputType="textEmailAddress" /> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_marginTop="4dp" android:fontFamily="sans-serif" android:hint="password" android:inputType="textPassword" /> </LinearLayout>
新建文件CustomDialog.java
package com.example.android_alertdialog; import android.app.Dialog; import android.content.Context; import android.view.LayoutInflater; import android.view.View; public class CustomDialog { private Context context; private Dialog dialog; public CustomDialog(Context context) { this.context = context; // TODO Auto-generated constructor stub dialog = new Dialog(context); } public void show() { View view = LayoutInflater.from(context).inflate( R.layout.custom_dialog, null); dialog.setContentView(view); dialog.show(); } }
button7.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub CustomDialog dialog = new CustomDialog(MainActivity.this); dialog.show(); } });
效果:
整理實現代碼:
<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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="多按鈕的普通對話框" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button2" android:layout_below="@+id/button2" android:text="列表選擇對話框" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/button1" android:text="單選列表選擇對話框" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/button3" android:text="多選列表選擇對話框" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button4" android:layout_centerVertical="true" android:text="進度條對話框一" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/button5" android:text="進度條對話框二" /> <Button android:id="@+id/button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button6" android:layout_below="@+id/button6" android:text="自定義對話框" /> </RelativeLayout>
package com.example.android_alertdialog; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnMultiChoiceClickListener; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button button; private Button button2; private Button button3; private Button button4; private Button button5; private Button button6; private Button button7; private final CharSequence[] items = { "北京", "上海", "廣州" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) this.findViewById(R.id.button1); button2 = (Button) this.findViewById(R.id.button2); button3 = (Button) this.findViewById(R.id.button3); button4 = (Button) this.findViewById(R.id.button4); button5 = (Button) this.findViewById(R.id.button5); button6 = (Button) this.findViewById(R.id.button6); button7 = (Button) this.findViewById(R.id.button7); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("提示"); builder.setMessage("你肯定要刪除嗎?"); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "肯定被點擊", Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "取消被點擊", Toast.LENGTH_SHORT).show(); } }); builder.setNeutralButton("忽略", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "忽略被點擊", Toast.LENGTH_SHORT).show(); } }); builder.setIcon(R.drawable.ic_launcher); AlertDialog alertDialog = builder.create(); alertDialog.show(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("請選擇如下城市"); // builder.setMessage("請選擇如下城市");//不能設置message的內容 builder.setItems(items, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub String select_item = items[which].toString(); Toast.makeText(MainActivity.this, "選擇了-->>" + select_item, Toast.LENGTH_SHORT) .show(); } }); AlertDialog dialog = builder.create(); dialog.show(); } }); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("請選擇如下城市"); builder.setSingleChoiceItems(items, -1, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub String select_item = items[which].toString(); Toast.makeText(MainActivity.this, "選擇了-->>" + select_item, Toast.LENGTH_SHORT) .show(); } }); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); AlertDialog dialog = builder.create(); dialog.show(); } }); button4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("請選擇如下城市"); builder.setMultiChoiceItems(items, new boolean[] { false, false, false }, new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // TODO Auto-generated method stub String select_item = items[which].toString(); Toast.makeText(MainActivity.this, "選擇了-->>" + select_item, Toast.LENGTH_SHORT) .show(); } }); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); AlertDialog dialog = builder.create(); dialog.show(); } }); button5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 第一種方法,使用ProgressDialog構造函數 ProgressDialog dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("等待"); dialog.setMessage("正在加載"); dialog.show(); // 第二種方法,使用靜態的show方法 // ProgressDialog.show(MainActivity.this, "等待", "正在加載....", // false,false); } }); button6.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 第一種方式 // ProgressDialog dialog = new ProgressDialog(MainActivity.this, // ProgressDialog.STYLE_HORIZONTAL); ProgressDialog dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("下載提示"); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setMax(100); dialog.setProgress(20); dialog.show(); } }); button7.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub CustomDialog dialog = new CustomDialog(MainActivity.this); dialog.show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:layout_width="match_parent" android:layout_height="64dp" android:background="#FFFFBB33" android:contentDescription="@string/app_name" android:scaleType="center" android:src="@drawable/ic_launcher" /> <EditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_marginTop="16dp" android:hint="username" android:inputType="textEmailAddress" /> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_marginTop="4dp" android:fontFamily="sans-serif" android:hint="password" android:inputType="textPassword" /> </LinearLayout>
package com.example.android_alertdialog; import android.app.Dialog; import android.content.Context; import android.view.LayoutInflater; import android.view.View; public class CustomDialog { private Context context; private Dialog dialog; public CustomDialog(Context context) { this.context = context; // TODO Auto-generated constructor stub dialog = new Dialog(context); } public void show() { View view = LayoutInflater.from(context).inflate( R.layout.custom_dialog, null); dialog.setContentView(view); dialog.show(); } }