android DialogFragment dismiss()不会弹出反栈

h5qlskok  于 2022-12-21  发布在  Android
关注(0)|答案(3)|浏览(229)

我有一个简单的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。

b4lqfgs4

b4lqfgs41#

我可以证实@Luksprog在评论中所说的话:对话框必须通过show(FragmentTransaction,String)启动。
看完来源后注意:确保对提供的事务调用addToBackStack(String),否则它仍然无法工作。

iszxjhcz

iszxjhcz2#

创建对话片段的方法是错误的。
永远不要用FragmentManager来显示对话片段,有一个方法叫做show(FragmentTransacion,String)。
在java中:

MyDialogFragment mDialogFragment = new MyDialogFragment();
mDialogFragment.show(getFragmentManager(), "MyDialogFragment");

另一方面,要关闭对话框,只需执行以下操作:

mDialogFragment.dismiss()

我想强调的另一个想法是,MyDialogFragment类是在onCreate方法内部定义的:'(如果需要,请在方法外部或在另一个文件中定义该类:)
好看!

hivapdat

hivapdat3#

dismiss()
findNavController().navigate(FirstBottomSheetDialogDirections.actionFirstSheetToSecondSheet())

这段代码总是错误的:dismiss()是一个异步操作,实际上不会立即消除任何内容。这与navigation()不同,后者会立即更新NavController的状态,将新的对话框目标堆叠在前一个对话框目标之上。
这意味着当异步dismiss实际发生时,它会正确地删除对话框,并且因为它是一个导航堆栈,所以会删除它上面的所有内容-包括第二个对话框。然而,由于DialogFragmentNavigator中的一个bug,我们实际上并没有删除第二个对话框,这就是为什么它看起来工作正常,尽管所有内容实际上已经内部不同步(从而导致后来的崩溃)。
弹出目标并导航到新目标的正确方法是使用popUpTo和popUpToInclusive。因此,您可以通过删除dismiss()调用并更新操作以弹出第一个对话框(作为navigate调用的一部分)来修复示例应用:

<action
    android:id="@+id/action_firstSheet_to_secondSheet"
    app:destination="@id/secondSheet"
    app:popUpTo="@id/firstSheet"
    app:popUpToInclusive="true"/>

这将正确地从返回堆栈中弹出第一个对话框,然后导航到新的对话框目标。
请参考此链接:https://issuetracker.google.com/issues/191073055

相关问题