DialogFragment dismiss() 不弹出回栈
Posted
技术标签:
【中文标题】DialogFragment dismiss() 不弹出回栈【英文标题】:DialogFragment dismiss() does not pop backstack 【发布时间】:2015-05-14 04:14:17 【问题描述】:根据文档,我有一个简单的 DialogFragment 在退出时调用dismiss:
public voiddismiss()
关闭片段及其对话框。 如果片段被添加到 返回堆栈,直到并包括此条目的所有返回堆栈状态将 被弹出。否则,将提交一个新事务以删除 片段。
然而,我发现在调用 dismiss() 之后,片段仍然在 backstack 上,所以我必须单击返回按钮来清除它。有谁知道为什么?
这是我的代码:
public void onCreate(Bundle b)
super.onCreate(b);
setContentView(R.layout.test_layout);
class MyDialogFragment extends DialogFragment implements OnClickListener
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View v = inflater.inflate(R.layout.hello_world, container, false);
Button b = (Button)v.findViewById(R.id.btn);
b.setOnClickListener(this);
return v;
@Override
public void onClick(View v)
dismiss();
getFragmentManager().beginTransaction().add(android.R.id.content, new MyDialogFragment(), "test").addToBackStack("b").commit();
@Override
public void onBackPressed()
if (getFragmentManager().getBackStackEntryCount() > 0 )
getFragmentManager().popBackStack();
else
super.onBackPressed();
我还发现如果不覆盖onBackPressed(),简单的后退按钮不起作用,无论我在activity中添加多少片段,后退按钮总是退出立即活动。
【问题讨论】:
我认为文档中的行为发生在您使用show()
方法将片段添加为实际对话框时,而不是像在代码中那样将其视为普通片段时发生。除非您做一些可疑的事情,否则“返回”按钮也应该可以工作。
您使用的是android.app.DialogFragment
还是android.support.v4.app.DialogFragment
?你找到解决这个问题的方法了吗?
【参考方案1】:
我可以确认@Luksprog在他的评论中所说的:对话必须通过show(FragmentTransaction, String)启动。
查看源代码后注意:确保在提供的事务上调用addToBackStack(String),否则它仍然无法工作。
【讨论】:
【参考方案2】:这是创建 DialogFragment 的错误方法。
永远不要使用 FragmentManager 来显示 DialogFragment。为了展示,有一个名为 show(FragmentTransacion, String) 的方法。
在java中:
MyDialogFragment mDialogFragment = new MyDialogFragment();
mDialogFragment.show(getFragmentManager(), "MyDialogFragment");
另一方面,要关闭对话框,只需执行以下操作:
mDialogFragment.dismiss()
我想强调的另一个想法是 MyDialogFragment 类是在内部定义的 onCreate 方法:'( 如果需要,请在方法之外或在另一个文件中定义类:)
好看!
【讨论】:
以上是关于DialogFragment dismiss() 不弹出回栈的主要内容,如果未能解决你的问题,请参考以下文章
DialogFragment: DialogFragment的一些理解
Android:DialogFragment.dismissInternal 处 DialogFragment.dismissAllow 处的 NullPointerException