Android 4.0设置Dialog点击屏幕不消失 .

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

为了实现业务的需求,想过使用Dialog风格的Activity,但是做出来的效果和系统的UI效果不匹配,最终只有失败告终。在黔驴技穷的时候,决定再仔细撸一下Android文档,终于在文档中发现了Dialog的setCanceledOnTouchOutside属性,具体使用如下:

方法一:

[java] view plain copy print ?
  1. public class MyAlertDialogFragment extends DialogFragment {  
  2.   
  3.     public static MyAlertDialogFragment newInstance(int title) {  
  4.         MyAlertDialogFragment frag = new MyAlertDialogFragment();  
  5.         Bundle args = new Bundle();  
  6.         args.putInt("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.         AlertDialog dialog = 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.         dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失   
  37.           
  38.         return dialog;  
  39.     }  
  40. }  

方法二:

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

[java] view plain copy print ?
  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 print ?
  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.         PromptDialogFragment pdf = new PromptDialogFragment();  
  24.         Bundle bundle = new Bundle();  
  25.         bundle.putString("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.                 R.layout.prompt_dialog, container, false);  
  57.   
  58.         TextView tv = (TextView)v.findViewById(  
  59.                                    R.id.promptmessage);  
  60.         tv.setText(getArguments().getString("prompt"));  
  61.   
  62.         Button dismissBtn = (Button)v.findViewById(  
  63.                                        R.id.btn_dismiss);  
  64.         dismissBtn.setOnClickListener(this);  
  65.   
  66.         Button saveBtn = (Button)v.findViewById(  
  67.                                     R.id.btn_save);  
  68.         saveBtn.setOnClickListener(this);  
  69.   
  70.         Button helpBtn = (Button)v.findViewById(  
  71.                 R.id.btn_help);  
  72.         helpBtn.setOnClickListener(this);  
  73.   
  74.         et = (EditText)v.findViewById(R.id.inputtext);  
  75.         if(icicle != null)  
  76.             et.setText(icicle.getCharSequence("input"));  
  77.         return v;  
  78.     }  
  79.   
  80.     @Override  
  81.     public void onSaveInstanceState(Bundle icicle) {  
  82.         icicle.putCharSequence("input", et.getText());  
  83.         super.onPause();  
  84.     }  
  85.   
  86.     @Override  
  87.     public void onCancel(DialogInterface di) {  
  88.         Log.v(MainActivity.LOGTAG, "in onCancel() of PDF");  
  89.         super.onCancel(di);  
  90.     }  
  91.   
  92.     @Override  
  93.     public void onDismiss(DialogInterface di) {  
  94.         Log.v(MainActivity.LOGTAG, "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.             act.onDialogDone(this.getTag(), false, tv.getText());  
  105.             dismiss();  
  106.             return;  
  107.         }  
  108.         if (v.getId() == R.id.btn_dismiss)  
  109.         {  
  110.             act.onDialogDone(this.getTag(), truenull);  
  111.             dismiss();  
  112.             return;  
  113.         }  
  114.         if (v.getId() == R.id.btn_help)  
  115.         {  
  116.             FragmentTransaction ft = getFragmentManager().beginTransaction();  
  117.             ft.remove(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.             ft.addToBackStack(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.     }  

转自:http://blog.csdn.net/weihan1314/article/details/8026830

你可能感兴趣的:(Android 4.0设置Dialog点击屏幕不消失 .)