在FragmentStateAdapter中放置多个片段时,setFragmentResultListener中是否需要getChildFragmentManager?

vlf7wbxs  于 2023-03-30  发布在  Android
关注(0)|答案(1)|浏览(123)

我们使用以下代码从基于www.example.com的DialogFragment中检索结果https://developer.android.com/guide/fragments/communicate#test

private void select() {
    SelectDialogFragment selectDialogFragment = SelectDialogFragment.newInstance();
    selectDialogFragment.show(getParentFragmentManager(), SELECT_DIALOG_FRAGMENT);
}

private void initFragmentResultListener() {
    FragmentManager fragmentManager = getParentFragmentManager();

    fragmentManager.setFragmentResultListener(SelectDialogFragment.SELECT_DIALOG_FRAGMENT_RESULT, getViewLifecycleOwner(), (requestKey, result) -> {
        ...
    });
}

但是,如果在androidx.viewpager2.adapter.FragmentStateAdapter中放置多个片段,则上述代码将无法正常工作。

例如,如果第二个可见片段显示的是DialogFragment,则第一个不可见片段将错误地获得结果。

经过一些尝试和错误之后,我们注意到需要使用getChildFragmentManager来修复这样的问题

private void select() {
    SelectDialogFragment selectDialogFragment = SelectDialogFragment.newInstance();
    selectDialogFragment.show(getChildFragmentManager(), SELECT_DIALOG_FRAGMENT);
}

private void initFragmentResultListener() {
    FragmentManager fragmentManager = getChildFragmentManager();

    fragmentManager.setFragmentResultListener(SelectDialogFragment.SELECT_DIALOG_FRAGMENT_RESULT, getViewLifecycleOwner(), (requestKey, result) -> {
        ...
    });
}

我想知道,这样的方法是解决问题的正确方法吗?* 因为我很少在官方示例中看到getChildFragmentManager,所以我对我的解决方案没有信心。
我的第一印象是,即使我们使用getParentFragmentManagergetViewLifecycleOwner也应该阻止第一个不可见的碎片得到结果。
由于很难确定将来什么时候将片段放置在ViewPager下,所以在使用setFragmentResultListener时,可以只使用getChildFragmentManager,以防止对话片段的结果发送到错误的片段。

pgky5nke

pgky5nke1#

您应该始终使用getChildFragmentManager作为DialogFragment,如DialogFragment指南中所述:
当从Fragment中创建DialogFragment时,必须使用Fragment的子FragmentManager来确保在配置更改后正确恢复状态。

new PurchaseConfirmationDialogFragment().show(
      getChildFragmentManager(), PurchaseConfirmationDialog.TAG);

相关问题