Android:自定义DialogFragment的内容和按钮

小问题,记录下~



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给的示例:

@Override
public 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();
}     

这是修改之后的:

@Override
public 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

时间: 2024-10-01 19:07:54

Android:自定义DialogFragment的内容和按钮的相关文章

Android 自定义EditText输入框 带清空按钮

总结  Android 自定义EditText输入框 带清空按钮 当用户输入字符后  EditText会自动在输入框的内部右侧出现删除按钮 重写EditText达到简化布局的效果 效果图: 继承EditText package com.example.myedittexttest; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; imp

Android 自定义dialogfragment

在用dialogfragment的时候我们可能会不喜欢系统自带的黑色边框,那怎么办呢? dialofragment提供可供修改样式的方法setStyle(style,R.style.MyTryUseDialogFragment); 里面两个参数可以用系统自带的也可以自定义,MyTryUseDialogFragment就是我自定义的style 在style文件下新建内容如下: 1 <style name="MyTryUseDialogFragment" parent="@

Android -- 自定义带进度条的按钮

1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击 2. 所需要的图片               3.  代码 MainActivity package com.example.buttondemo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View;

android自定义View-------滑动按钮

源码和测试例子已经放到github https://github.com/Leaking/SlideSwitch 效果图如下,传不了gif图片,暂且截一个静态图片.其中按钮滑动时颜色有渐变效果. 先说说大概思路:按钮绘制了三个图层,最下面是覆盖整个View的灰色,第二个是覆盖整个View的自定义的颜色,它可以改变透明度.第三个是白色.当白色部分移动时,修改第二个图层的透明度即可. 大概记录一下重写一个组件的实现过程. 1,定义属性 2,,在Java代码中的构造器获取属性的值 3,重写onMeas

Android 自定义UI圆角按钮

Android实际开发中我们一般需要圆角的按钮,一般情况下我们可以让美工做出来相应的按钮图片,然后放上去即可,另外我们可以在布局文件中直接设置,也可以达到一样的效果.下面讲解在布局文件中自定义圆角按钮的小Demo. 代码很简单,实现效果图: 源代码: 源代码: 这里主要是xml布局文件实现: MainActivity: package com.android_drawableresource; import android.app.Activity; import android.os.Bund

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中没有数据. 如下面的代码: 这就是在initData中异步获取服务器的数据,然后实例化adatper,再将adapter赋给listView. 2.initData()中的代码是: 这里线程要睡眠5秒钟,是为了模仿网络的耗时操作 3.Handler: 在Handler中接收到数据后给list赋值后,

Android自定义按钮实现长按功能

通过自定义BUTTON,写一个LongTouchBtn类,在按下的时候执行onTouchEvent事件,通过这个事件使用回调函数来实现长按功能! XML: <huahua.btnlongtouch.LongTouchBtn android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=&q

android自定义TextView

Android控件中的TextView控件只有一个输入框,但是为了用于的操作方便我们应该实现一些功能: 1. 可以直接将内容删除的功能按钮 2. 可以记录用户以前输入的数据,同时能够将数据通过下拉显示,点击的时候实现输入 先上图: 下拉的图片没有做,所以和删除的图片使用同一个了,同志们可以直接在xml文件中更换就行了 分析: 肯定要使用自定义view来实现的,我们知道自定义view大概可以分为三类:自绘控件,组合控件,继承控件,我们这里是要进行增强的textView的功能,所以我这里使用的 是组