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(), true, null);  
  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的两种创建方式,希望对大家有所帮助

时间: 2025-01-31 01:32:12

Android 4.0设置Dialog点击屏幕不消失的相关文章

Android 4.0 设置全屏修改的解决方法_Android

最近在做一个平板的应用,底部的BACK HOME 还有电池WIFI的那一条STATUS_BAR设置全屏后怎么也去不掉,查找资料后,发现一个比较好的方法,在此分享 第一种方式(程序代码): 在OnCreate里添加一行语句 复制代码 代码如下: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);  在setContentView之前哦. 过时的一个方法: 复制代码 代码如下: getW

Android 4.0 设置全屏修改的解决方法

最近在做一个平板的应用,底部的BACK HOME 还有电池WIFI的那一条STATUS_BAR设置全屏后怎么也去不掉,查找资料后,发现一个比较好的方法,在此分享 第一种方式(程序代码): 在OnCreate里添加一行语句 复制代码 代码如下: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 在setContentView之前哦. 过时的一个方法: 复制代码 代码如下: getWi

Android 3.0七大特性全解析

在2011年伊始,翻开了全新一年的篇章,作为我们日常生活中不可或缺的消费电子产品亦然进入了全新的时代,随着一年一度的2011年CES国际消费电子产品展览会,在北京时间1月7日(美国西部当地时间1月6日),于美国赌城拉斯维加斯展览中心盛大拉开帷幕. 更值得注意的是,在本次CES国际消费电子产品展览会上,此前传闻不断的基于Android 3.0(蜂巢)系统,被大面积的作用在平板电脑电子产品上,首次向世人展示了其Android 3.0(蜂巢)系统的强劲表现,而也被很多消费者认定为Android 3.0

Android 3.0“.NET研究”七大特性全解析

在2011年伊上海企业网站制作始,翻开了全新一年的篇章,作为我们日常生活中不可或缺的消费电子产品亦然进入了全新的时代,随着一年一度的2011年CES国际消费电子产品展览会,在北京时间1月7日(美国西部当地时间1月6日),于美国赌城拉斯维加斯展览中心盛大拉开帷幕. 更值得注意的是,在本次CES国际消费电子产品展览会上,此前传闻不断的基于Android 3.0(蜂巢)系统,被大面积的作用在平板电脑电子产品上,首次向世人展示了其Android 3.0(蜂巢)系统的强劲表现,而也被很多消费者认定为And

谷歌将在几周内发布Android 4.0.3

预计Android 4.0.3将在"未来几周内" 正式推出新浪科技讯 北京时间12月20日早间消息,谷歌发布了Android 4.0操作系统的最新版本4.0.3,称其对Android系统作出了多处改进,并修复了一些缺陷.谷歌上周五在Android开发者博客上称,预计Android 4.0.3将在"未来几周内"正式推出,在手机和平板电脑等产品中搭载.有基于此,谷歌建议开发者使用这个最新版本的系统来测试其移动应用.谷歌并未公布Android 4.0.3操作系统的特性,仅

webview-华为EMUI4.0 Android的WebView设置setJavaScriptEnabled无效

问题描述 华为EMUI4.0 Android的WebView设置setJavaScriptEnabled无效 本人在使用HTML5开发过程中遇到这样一个问题,我将html和js文件放到Android的assets下,在Activity中使用webview来加载html,但是我加上webview.getSettings().setJavaScriptEnabled(true)这句话的话,在华为EMUI4.0系统下,会出现一直显示加载的情况.望各位大神指教 解决方案 打开网页时不调用系统浏览器, 而

位置-android 5.0 下界面主题设置

问题描述 android 5.0 下界面主题设置 希望将弹出框的位置改变带actionbar下面 不要直接换个theme的方法 希望由 style 加些属性改变 解决方案 android 对话框弹出位置和透明度的设置 在android中我们经常会用AlertDialog来显示对话框.通过这个对话框是显示在屏幕中心的.但在某些程序中,要求对话框可以显 示在不同的位置.例如,屏幕的上方或下方.要实现这种效果.就需要获得对话框的Window对象,获得这个Window对象有多种方法.最容易的就是直接 通

android开发-Android开发怎么实现退出客户端后也能点击屏幕顶端(状态栏位置)启动一个特定的应用程序

问题描述 Android开发怎么实现退出客户端后也能点击屏幕顶端(状态栏位置)启动一个特定的应用程序 想要实现退出客户端后也能点击屏幕顶端(状态栏位置)启动一个特定的应用程序,这个app怎么做?主要是实现不了退出应用程序后也能监听点击事件,以及service怎么响应该点击事件,跪求大神. 解决方案 如果退出程序还需要监控的话,就需要捕捉系统的通知了 以下代码是android 判断点击的位置是不是在指定的view上修改为判断点击的位置是不是在状态栏上,如果是的话,就执行指定的操作private b

android百度地图3.0 设置多个覆盖物后如何自动缩放显示所有覆盖物

问题描述 android百度地图3.0 设置多个覆盖物后如何自动缩放显示所有覆盖物 android百度地图3.0 设置多个覆盖物后,地图显示不全所有的覆盖物,如何一进去地图就能自动缩放显示所有的覆盖物 解决方案 使用OverlayManager类中的 ** zoomToSpan();**//缩放地图,使所有overlay都在合适的视野内.**该方法只对Marker类型的overlay有效** 方法. 你需要重写PoiOverlay继承与OverlayManager.实现里面的方法. 然后调用zo