我正在使蜂窝项目/分叉向后兼容1.6 +。
根据Google / Android提供的文档,我决定在DialogFragment
之后构建我的所有片段,这些片段非常适合蜂窝...它让我可以灵活地将任何内容放在对话框或“全屏幕” '元素。
我现在已经整合了兼容工具包,并将我的导入和方法调用移到了那里。现在我在2.3我试图发起一个相同的意图,但我收到了这个问题:
java.lang.IllegalStateException: DialogFragment can not be attached to a container view
DialogFragment
的文档表明,当您不需要对话框/弹出功能时,它可以作为Fragment
执行。
答案 0 :(得分: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;
}
基本上,他们确实写了支持,但是在dialog / embedded之间切换的切换不起作用。
所以这里我们默认嵌入,然后设置为在我们显示之前显示为对话框。
答案 1 :(得分:3)
您可以使用android.support.v4.app.DialogFragment版本,请检查here
答案 2 :(得分:2)
我遇到了同样的问题。我从未找到过“正确”的解决方案,但您可以通过在OnCreateDialog()
中设置对话框的主题来做同样的事情。通过将主题设置为android.R.style.Theme_Holo_DialogWhenLarge
,对话框将在大屏幕和xlarge屏幕上显示为对话框,而在小屏幕和普通屏幕上将显示为全屏幕窗口。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_DialogWhenLarge);
}
答案 3 :(得分:2)
我正在使用DialogFragment子类,并在onCreate()中执行此操作。我在调用onCreate()之前调用setShowsDialog()(在我的Activity的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);
}
}
答案 4 :(得分:0)
您是否查看过应用说明?它显示了嵌入对话框的推荐方法,我已经验证了它在2.2.1上的工作原理。
http://developer.android.com/reference/android/app/DialogFragment.html#DialogOrEmbed
我的片段布局必须改为符合,但它快速而简单。能够在XML中定义对话框片段并期望在没有任何额外工作的情况下嵌入它是更自然的(因为Compat API的上述更改将支持);并且只能通过show()调用时期望模态行为。我想这不是当前的行为。