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

简介:

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

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

方法一:

[java]  view plain copy
  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
  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.         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.     }  
  130. }  

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

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

相关文章
|
2月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
|
3月前
|
JavaScript Android开发
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
63 0
|
21天前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
22 1
|
1月前
|
存储 XML 编译器
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
48 3
|
3月前
|
网络安全 Android开发
2023安卓逆向 -- 抓包环境设置(Charles+Postern)
2023安卓逆向 -- 抓包环境设置(Charles+Postern)
33 0
|
3月前
|
Android开发
解决在Android Compose中点击空白处收回软键盘
解决在Android Compose中点击空白处收回软键盘
|
4月前
|
XML API Android开发
Android 自定义View 之 Dialog弹窗
Android 自定义View 之 Dialog弹窗
|
4月前
|
XML Java Android开发
Android App事件交互中区分点击和长按动作以及识别手势滑动方向的讲解及实战(附源码 可直接使用)
Android App事件交互中区分点击和长按动作以及识别手势滑动方向的讲解及实战(附源码 可直接使用)
60 0
|
4月前
|
XML 数据库 数据安全/隐私保护
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
41 0
|
4月前
|
XML Java Android开发
Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)
Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)
81 0