设备API级别<11的DialogFragments

9
我正在将一个蜂窝项目/分叉与1.6+向后兼容的过程中。
根据谷歌/Android提供的文档,我决定基于所有片段构建DialogFragment,这对于蜂窝来说非常好...它使我能够将任何东西作为对话框或“全屏”元素放置。
现在,我已经整合了兼容包并将我的导入和方法调用移到了那里。现在我在2.3上尝试启动一个完全相同的意图,但我收到了这个问题:
java.lang.IllegalStateException: DialogFragment can not be attached to a container view
< p > DialogFragment 的文档建议,当您不需要对话框/弹出功能时,它可以作为 Fragment 进行使用。

5个回答

9

我成功地在兼容包的DialogFragment.java中修复了这个问题:

更改第74行:boolean mShowsDialog = false;

将第232行注释掉://mShowsDialog = mContainerId == 0;

然后将两个show方法更改为以下内容:

public void show(FragmentManager manager, String tag) {
    this.setShowsDialog(true);
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commit();
}

// JavaDoc removed
public int show(FragmentTransaction transaction, String tag) {
    this.setShowsDialog(true);
    transaction.add(this, tag);
    mRemoved = false;
    mBackStackId = transaction.commit();
    return mBackStackId;
}

基本上,他们是支持写入的,但用于在对话框和嵌入式之间切换的开关无法正常工作。
因此,在这里我们默认使用嵌入式,然后在显示之前设置为对话框模式。

这个变更集基于哪个版本(即来自https://android.googlesource.com/platform/frameworks/support的SHA1提交ID)?我试图使用支持库的当前版本重现您的修复,但是因为显然Google没有标记他们用于发布的r <n>版本代码,所以我在正确执行时遇到了麻烦。我已经尝试使用提交863d7b4。 - arne.jans
我的意思是:我已经将您的变更集与提交 863d7b4 进行了比较。 - arne.jans
将您的更改合并到DialogFragment中对我来说无法解决IllegalStateException问题。顺便说一下,我尝试将DialogFragment显示为对话框。 - arne.jans
这些修复是在13个月前完成的。Google自己已经解决了这个问题。 - Chris Banes
1
刚刚检查了支持库的 V11 版本,但这个 bug 仍然存在。 - 4ntoine
显示剩余3条评论

3
您可以使用 android.support.v4.app.DialogFragment 版本,请查看 这里

2

我有过同样的问题。我从未找到“正确”的解决方案,但是您可以通过在 OnCreateDialog() 中设置对话框的主题来实现同样的功能。将主题设置为 android.R.style.Theme_Holo_DialogWhenLarge,则在大屏幕和超大屏幕上会显示对话框,而在小屏幕和普通屏幕上则会显示全屏窗口。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_DialogWhenLarge);
}

2

我正在使用一个DialogFragment子类,并在onCreate()中执行此技巧。我在Activity的onAttachFragment()中调用setShowsDialog(),在onCreate()被调用之前。

public class DialogFragmentHosted extends DialogFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        boolean forceShowDialog = savedInstanceState==null;
        boolean showsDialog = getShowsDialog();
        super.onCreate(savedInstanceState);
        if (forceShowDialog )
            setShowsDialog(showsDialog);
    }
}

0

你有查看应用笔记吗?它展示了一种嵌入对话框的推荐方式,我已经验证过这在2.2.1上可以工作。

http://developer.android.com/reference/android/app/DialogFragment.html#DialogOrEmbed

我的片段布局必须改变以符合要求,但这很快很容易。在XML中定义对话片段并期望它被嵌入而无需任何额外工作(如上所述的Compat API更改支持的方式)更自然,并且只有通过show()调用时才期望模态行为。我想那不是当前的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接