我有一个简单的DialogFragment,它在退出时调用dismiss,如文档所示:
公共无效驳回()
解除片段及其对话框。**如果片段已添加到反向堆栈,则将弹出此条目之前的所有反向堆栈状态(包括此条目)。否则,将提交新事务以移除片段。
然而,我发现在调用dismiss()**后,这个片段仍然在堆栈中,所以我必须点击后退按钮来清除它。有人知道为什么吗?
下面是我代码:
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添加多少片段,后退按钮总是立即退出Activity。
3条答案
按热度按时间b4lqfgs41#
我可以证实@Luksprog在评论中所说的话:对话框必须通过show(FragmentTransaction,String)启动。
看完来源后注意:确保对提供的事务调用addToBackStack(String),否则它仍然无法工作。
iszxjhcz2#
创建对话片段的方法是错误的。
永远不要用FragmentManager来显示对话片段,有一个方法叫做show(FragmentTransacion,String)。
在java中:
另一方面,要关闭对话框,只需执行以下操作:
我想强调的另一个想法是,MyDialogFragment类是在onCreate方法内部定义的:'(如果需要,请在方法外部或在另一个文件中定义该类:)
好看!
hivapdat3#
这段代码总是错误的:dismiss()是一个异步操作,实际上不会立即消除任何内容。这与navigation()不同,后者会立即更新NavController的状态,将新的对话框目标堆叠在前一个对话框目标之上。
这意味着当异步dismiss实际发生时,它会正确地删除对话框,并且因为它是一个导航堆栈,所以会删除它上面的所有内容-包括第二个对话框。然而,由于DialogFragmentNavigator中的一个bug,我们实际上并没有删除第二个对话框,这就是为什么它看起来工作正常,尽管所有内容实际上已经内部不同步(从而导致后来的崩溃)。
弹出目标并导航到新目标的正确方法是使用popUpTo和popUpToInclusive。因此,您可以通过删除dismiss()调用并更新操作以弹出第一个对话框(作为navigate调用的一部分)来修复示例应用:
这将正确地从返回堆栈中弹出第一个对话框,然后导航到新的对话框目标。
请参考此链接:https://issuetracker.google.com/issues/191073055