1. 程式人生 > >android開發 -- 對話方塊 Dialog 和 DialogFragment 詳解( Android 官方推薦 DialogFragment 建立對話方塊 )

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();

說明:該方法不只是輸入框控制元件,其他控制元件也可以,具體可以自己試試哈