9

我正在制作一个蜂窝项目/叉向后兼容1.6+的过程。设备API级别的对话框片段<11

根据谷歌/安卓系统提供的文档,我决定将所有关于DialogFragment的片段都制作成非常适合蜂窝的格式......它使我能够灵活地将任何东西当作对话框或“全屏”元素。

我现在已经包含了兼容性工具包,并将我的导入和方法调用移到了该位置。现在,我在2.3我试图推出一个相同的意图,但我得到这个问题:

java.lang.IllegalStateException: DialogFragment can not be attached to a container view 

DialogFragment的文件表明,它可以作为Fragment执行,当你不想要的对话框/弹出功能。

回答

9

我设法在兼容包的DialogFragment.java妥善解决这个问题:

更改行74: boolean mShowsDialog = false;

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

然后改变两个表演方法对此:

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; 
} 

基本上,他们确实支持写入,但切换对话框/嵌入式的切换不起作用。

所以这里我们默认为嵌入,然后设置为在我们展示它之前显示为对话框。

+0

还:'onSaveInstanceState'只能保存'mShowsDialog',如果它是'true'。你只需要从'if'中删除'!'。 – 2011-10-21 01:24:56

+0

在哪个版本(https://android.googlesource.com/platform/frameworks/support中的SHA1提交ID)基于?我试图用当前版本的支持库重现您的修补程序,但是无法正确执行此操作,因为Google显然没有使用它们用于发行版的r 修订版代码进行标记。我已经尝试提交863d7b4。 – 2012-12-19 10:17:43

+0

我的意思是:我将你的变更集与提交863d7b4进行了比较。 – 2012-12-19 10:30:58

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); 
} 
0

您是否检查了应用笔记?它显示了一个嵌入对话框的推荐方法,我已经验证了这个在2.2.1上的作用。

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

我的片段布局必须改变,以符合,但它是快速和容易。能够用XML定义对话框片段并且期望在没有任何额外工作的情况下嵌入对话框片段是更自然的(如上面对Compat API的支持所支持的那样);并且只在通过show()调用时才会期望模态行为。我想这不是目前的行为。

2

我正在使用DialogFragment子类,并在onCreate()作品中执行此技巧。我打电话的onCreate前setShowsDialog()()被调用(在onAttachFragment()我的活动)

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); 
    } 
} 
3

可以使用android.support.v4.app.DialogFragment版本,请检查here