小问题,记录下~

Android4.0以后开始推荐使用DialogFragment代替Dialog。Android的官方文档中给了两个示例:

  • 一个Basic Dialog
    示例了如何自定义窗口内容——重写onCreateView方法。
  • 一个Alert Dialog
    示例了如何自定义弹窗的正负按钮——重写onCreateDialog方法。

好的,那么问题来了

在实际应用中经常是需要既自定义窗口内容、又需要自定义按钮的。
这时候如果我们按图索骥,把DialogFragment的onCreateView和onCreateDialog方法都重写的话,会发现——Bong!异常~ 诸如“AndroidRuntimeException: requestFeature() must be called before adding content”的就出现了。

这个异常出现的原因可以看:stackoverflow的这个问题中Freerider的答案以及下面评论。
摘抄一下:“ You can override both (in fact the DialogFragment says so), the problem comes when you try to inflate the view after having already creating the dialog view. You can still do other things in onCreateView, like use the savedInstanceState, without causing the exception.”

然后是解决方案:

既然两个方法不能同时重写,所以就选择一个进行重写:
重写onCreateDialog方法,参照官方示例即可以自定义按钮,然后对其作修改,使之能自定义view——在AlertDialog.Builder进行create()创建dialog之前,使用AlertDialog.Builder的setView(view)方法,其中view是自定view。

来感受一下区别~
这是Google给的示例:

@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {    int title = getArguments().getInt("title");    return new AlertDialog.Builder(getActivity())            .setIcon(R.drawable.alert_dialog_icon)            .setTitle(title)            .setPositiveButton(R.string.alert_dialog_ok, 。。。)            .setNegativeButton(R.string.alert_dialog_cancel, 。。。)            .create();}     


这是修改之后的:

@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {    //inflater在前面构造函数中实例化    View v = inflater.inflate(R.layout.dialog,null);    imageGridView = (GridView) v.findViewById(R.id.gridViewImage);    //自定义view,bla~bla~    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());    return builder.setView(v)            .setIcon(android.R.drawable.ic_dialog_alert)            .setTitle(title)            .setCancelable(false)            .setPositiveButton(R.string.alert_dialog_ok, 。。。)            .setNegativeButton(R.string.alert_dialog_cancel, 。。。)            .create();}


Also at: http://www.barryzhang.com/archives/396

更多相关文章

  1. android 访问/assets 和/res目录下文件的方法
  2. 《Android(安卓)安全(二)》Smali语法基础
  3. Android的消息循环机制 Looper Handler类分析
  4. 浅谈Android的移动存储SharedPreferences技术
  5. Ubuntu 12.04.3 64位 安装android sdk完成后 adb 无效 解决方法
  6. Android之Android触摸事件传递机制
  7. [置顶] Android(安卓)studio build.gradle 各种错误解决总结
  8. 【DiskLruCache完全解析】Android(安卓)AdapterView图片硬盘缓存
  9. Androidの短信拦截方法详解

随机推荐

  1. eclipse安装ADT插件重启后不显示Android(
  2. Android(安卓)中SoftAP架构研究
  3. 杂乱之android的Gallery图像展示应用
  4. Android(安卓)Studio常用配置及使用技巧(
  5. 第八章 列表、菜单以及其它视图——上
  6. 【Android】Binder架构深度解析
  7. Android实现圆形、圆角和椭圆自定义图片V
  8. android Task(任务)的简单理解
  9. Android新建工程出错-Android+Packaging+
  10. Android绯荤粺鏋舵瀯鍥惧強绠€鍗曠殑绯