android開發 -- 對話方塊 Dialog 和 DialogFragment 詳解( Android 官方推薦 DialogFragment 建立對話方塊 )
Android 官方推薦使用 : DialogFragment 建立對話方塊 ,不推薦直接使用Dialog建立對話方塊,所以能用寫對話方塊儘量用DialogFragment。自定義對話方塊也方便很多
推薦一篇DialogFragment的文章:http://blog.csdn.net/lmj623565791/article/details/37815413
ps:這是我在用出現的問題:我需要在一個Fragment中使用DialogFragment,結果在【LoginInputListener listener = (LoginInputListener) getActivity();】這一行就報錯了,所以解決辦法如下:
使用Fragment的Activity MainActivity類要繼承FragmentActivity,因為在下面getSupportFragmentManager要用到 ;
如:public class MainActivity extends FragmentActivity { }
官方推薦 DialogFragment 大致原因:
DialogFragment建立時通過new intance方法,當Activity的狀態發生改變時,資料可保留,而一般的方式將會導致dialog資料被初始化,比如切屏的時候就是這類的典型。
************************以下為Dialog詳解******************************
對話方塊形式大致可分為五種:分別是一般對話方塊形式,列表對話方塊形式,單選按鈕對話方塊,多選按鈕對話方塊,自定義對話方塊。
在實際開發中,用系統的對話方塊會很少,因為太醜了,美工不願意,多是使用自定義對話方塊。當然學會系統的,自定義就簡單了,所以我們先來學習系統的,後面在寫一篇自定義對話方塊。
一般對話方塊:
不多說先上圖:
程式碼:
private void dialog1(){ AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器 builder.setTitle("提示"); //設定標題 builder.setMessage("是否確認退出?"); //設定內容 builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可 builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { //設定確定按鈕 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //關閉dialog Toast.makeText(MainActivity.this, "確認" + which, Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //設定取消按鈕 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show(); } }); builder.setNeutralButton("忽略", new DialogInterface.OnClickListener() {//設定忽略按鈕 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show(); } }); //引數都設定完成了,建立並顯示出來 builder.create().show(); }
說明:程式碼上註釋已經比較全了,相信大家都能看得懂!dialog可以設定三個選擇按鈕,設定時指定按鈕響應事件。
是不是覺得三個按鈕寫了三遍響應事件,很繁瑣呢?注意:onClick的引數中有一個which,這個是什麼意思呢?這個which實際上代表的是一個唯一的int型數值。像上面的setPositiveButton中的which代表的是-1,setNegativeButton中的which代表的是-3,setNeutralButton中的which代表的是-2. 到了這裡相信大家已經想到怎麼簡潔的寫法了,只要寫一個響應事件,用which引數去區分是那個按鈕就可以了!
看簡潔的程式碼2:和上面的效果是一樣的!
private void dialog1_1(){
//先new出一個監聽器,設定好監聽
DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case Dialog.BUTTON_POSITIVE:
Toast.makeText(MainActivity.this, "確認" + which, Toast.LENGTH_SHORT).show();
break;
case Dialog.BUTTON_NEGATIVE:
Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();
break;
case Dialog.BUTTON_NEUTRAL:
Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show();
break;
}
}
};
//dialog引數設定
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
builder.setMessage("是否確認退出?"); //設定內容
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
builder.setPositiveButton("確認",dialogOnclicListener);
builder.setNegativeButton("取消", dialogOnclicListener);
builder.setNeutralButton("忽略", dialogOnclicListener);
builder.create().show();
}
列表對話方塊:
程式碼:
private void dialog2() {
final String items[]={"張三","李四","王五"};
//dialog引數設定
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
//builder.setMessage("是否確認退出?"); //設定內容
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
//設定列表顯示,注意設定了列表顯示就不要設定builder.setMessage()了,否則列表不起作用。
builder.setItems(items,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "確定", Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
}
說明:列表對話方塊只需設定Items屬性即可,注意不能在設定Message屬性,否則只會顯示Message,不會顯示列表。這裡的setItems中的Onclick中的which屬性是items陣列的下標!
單選按鈕對話方塊:
程式碼:
private void dialog3(){
final String items[]={"男","女"};
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
builder.setSingleChoiceItems(items,0,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//dialog.dismiss();
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "確定", Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
}
說明:其實也沒什麼好說的,和上面的差不多,只是設定單選用setSingleChoiceItems,注意這裡的引數:items是顯示的文字,0表示預設選中是第一個,如圖所示是預設選中“男”。
多選列表對話方塊:
程式碼:
private void dialog4(){
final String items[]={"籃球","足球","排球"};
final boolean selected[]={true,false,true};
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
builder.setMultiChoiceItems(items,selected,new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// dialog.dismiss();
Toast.makeText(MainActivity.this, items[which]+isChecked, Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "確定", Toast.LENGTH_SHORT).show();
//android會自動根據你選擇的改變selected陣列的值。
for (int i=0;i<selected.length;i++){
Log.e("hongliang",""+selected[i]);
}
}
});
builder.create().show();
}
說明:setMultiChoiceItems中的引數:selected是預設的對應的選中狀態。當你選擇時,系統會自動幫你把selected中的值做相應改變,所以在確定按鈕中可以得到所有的選擇狀態。其他和單選一樣。
輸入框對話方塊(同理,其他控制元件也可以):
程式碼:
//設定一個輸入框控制元件
final EditText inputServer = new EditText(getActivity());
inputServer.setFocusable(true);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("請輸入要查詢的關鍵詞:")
// .setIcon(R.mipmap.ic_launcher)
.setView(inputServer) //設定一個控制元件(其他控制元件同理)
.setNegativeButton("取消", null);
builder.setPositiveButton("確認",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String input = inputServer.getText().toString();
}
});
builder.show();
說明:該方法不只是輸入框控制元件,其他控制元件也可以,具體可以自己試試哈