业务的需求是变化莫测的,最近就遇到一个需求是——用户只有点击Dialog的取消按钮才会消失,点击屏幕的时候不消失。Android ICS对UI做了很大的变动,系统提倡使用DialogFragment,但是系统默认的操作习惯是点击屏幕Dialog会自动消失。

setCanceledOnTouchOutside属性,具体使用如下:

方法一:


[java]  ​​view plain​​ ​​copy​​



  1. public class MyAlertDialogFragment extends DialogFragment {  
  2.   
  3. public static MyAlertDialogFragment newInstance(int title) {  
  4. new MyAlertDialogFragment();  
  5. new Bundle();  
  6. "title", title);  
  7.         frag.setArguments(args);  
  8. return frag;  
  9.     }  
  10.   
  11. @TargetApi(11)  
  12. @Override  
  13. public Dialog onCreateDialog(Bundle savedInstanceState) {  
  14. int title = getArguments().getInt("title");  
  15.   
  16.           
  17. new AlertDialog.Builder(getActivity())  
  18.         .setIcon(R.drawable.ic_launcher)  
  19.           
  20.         .setTitle(title)  
  21.         .setPositiveButton(R.string.alert_dialog_ok,  
  22. new DialogInterface.OnClickListener() {  
  23. public void onClick(DialogInterface dialog, int whichButton) {  
  24.                     ((MainActivity)getActivity()).doPositiveClick();  
  25.                 }  
  26.             }  
  27.         )  
  28.         .setNegativeButton(R.string.alert_dialog_cancel,  
  29. new DialogInterface.OnClickListener() {  
  30. public void onClick(DialogInterface dialog, int whichButton) {  
  31.                     ((MainActivity)getActivity()).doNegativeClick();  
  32.                 }  
  33.             }  
  34.         )  
  35.         .create();  
  36. false);// 设置点击屏幕Dialog不消失  
  37.           
  38. return dialog;  
  39.     }  
  40. }  


方法二:

在oncreate()方法中设置Dialog点击屏幕不可取消,实例代码如下:


[java]  ​​view plain​​ ​​copy​​



  1. @Override      
  2. public void onCreate(Bundle icicle)  
  3.  {  
  4. super.onCreate(icicle);  
  5. this.setCancelable(false);// 设置点击屏幕Dialog不消失  
  6. int style = DialogFragment.STYLE_NORMAL, theme = 0;  
  7.      setStyle(style,theme);  
  8.  }  


(提示:提醒大家一下在覆写了onCreateDialog()方法后,就不能覆写onCreateView()方法了)

说到这儿就给大家介绍一下创建DialogFragment的第二种方式吧,第一种方式上面已经叙述了,在此就不再叙述了,直接看第二种实现的具体方式,具体代码如下所示:


[java]  ​​view plain​​ ​​copy​​



  1. import android.app.Activity;  
  2. import android.app.DialogFragment;  
  3. import android.app.FragmentTransaction;  
  4. import android.content.DialogInterface;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.Button;  
  11. import android.widget.EditText;  
  12. import android.widget.TextView;  
  13.   
  14. public class PromptDialogFragment   
  15. extends DialogFragment   
  16. implements View.OnClickListener  
  17. {  
  18. private EditText et;  
  19.   
  20. public static PromptDialogFragment  
  21.     newInstance(String prompt)  
  22.     {  
  23. new PromptDialogFragment();  
  24. new Bundle();  
  25. "prompt",prompt);  
  26.         pdf.setArguments(bundle);  
  27.           
  28. return pdf;  
  29.     }  
  30.   
  31. @Override  
  32. public void onAttach(Activity act) {  
  33. // If the activity we're being attached to has  
  34. // not implemented the OnDialogDoneListener  
  35. // interface, the following line will throw a  
  36. // ClassCastException. This is the earliest we  
  37. // can test if we have a well-behaved activity.  
  38.         OnDialogDoneListener test = (OnDialogDoneListener)act;  
  39. super.onAttach(act);  
  40.     }  
  41.   
  42. @Override      
  43. public void onCreate(Bundle icicle)  
  44.     {  
  45. super.onCreate(icicle);  
  46. this.setCancelable(true);  
  47. int style = DialogFragment.STYLE_NORMAL, theme = 0;  
  48.         setStyle(style,theme);  
  49.     }  
  50. //  覆写onCreateView()方法,实现DialogFragment的布局。注意不能同时覆写 onCreateView()和onCreateDialog()方法  
  51. public View onCreateView(LayoutInflater inflater,              
  52.             ViewGroup container,   
  53.             Bundle icicle)  
  54.     {  
  55.         View v = inflater.inflate(  
  56. false);  
  57.   
  58.         TextView tv = (TextView)v.findViewById(  
  59.                                    R.id.promptmessage);  
  60. "prompt"));  
  61.   
  62.         Button dismissBtn = (Button)v.findViewById(  
  63.                                        R.id.btn_dismiss);  
  64. this);  
  65.   
  66.         Button saveBtn = (Button)v.findViewById(  
  67.                                     R.id.btn_save);  
  68. this);  
  69.   
  70.         Button helpBtn = (Button)v.findViewById(  
  71.                 R.id.btn_help);  
  72. this);  
  73.   
  74.         et = (EditText)v.findViewById(R.id.inputtext);  
  75. if(icicle != null)  
  76. "input"));  
  77. return v;  
  78.     }  
  79.   
  80. @Override  
  81. public void onSaveInstanceState(Bundle icicle) {  
  82. "input", et.getText());  
  83. super.onPause();  
  84.     }  
  85.   
  86. @Override  
  87. public void onCancel(DialogInterface di) {  
  88. "in onCancel() of PDF");  
  89. super.onCancel(di);  
  90.     }  
  91.   
  92. @Override  
  93. public void onDismiss(DialogInterface di) {  
  94. "in onDismiss() of PDF");  
  95. super.onDismiss(di);  
  96.     }  
  97.   
  98. public void onClick(View v)   
  99.     {  
  100.         OnDialogDoneListener act = (OnDialogDoneListener)getActivity();  
  101. if (v.getId() == R.id.btn_save)  
  102.         {  
  103.             TextView tv = (TextView)getView().findViewById(R.id.inputtext);  
  104. this.getTag(), false, tv.getText());  
  105.             dismiss();  
  106. return;  
  107.         }  
  108. if (v.getId() == R.id.btn_dismiss)  
  109.         {  
  110. this.getTag(), true, null);  
  111.             dismiss();  
  112. return;  
  113.         }  
  114. if (v.getId() == R.id.btn_help)  
  115.         {  
  116.             FragmentTransaction ft = getFragmentManager().beginTransaction();  
  117. this);  
  118.   
  119. // in this case, we want to show the help text, but  
  120. // come back to the previous dialog when we're done  
  121. null);  
  122. //null represents no name for the back stack transaction  
  123.   
  124.             HelpDialogFragment hdf =  
  125.                     HelpDialogFragment.newInstance(R.string.help1);  
  126.             hdf.show(ft, MainActivity.HELP_DIALOG_TAG);  
  127. return;  
  128.         }  
  129.     }  
  130. }  


代码比较简单,注释已经写明白了,相信大家都能看懂的! 

以上只是设置Dialog的一个小技巧以及创建DialogFragment的两种创建方式,希望对大家有所帮助