我们使用以下代码从基于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
,所以我对我的解决方案没有信心。
我的第一印象是,即使我们使用getParentFragmentManager
,getViewLifecycleOwner
也应该阻止第一个不可见的碎片得到结果。
由于很难确定将来什么时候将片段放置在ViewPager
下,所以在使用setFragmentResultListener
时,可以只使用getChildFragmentManager
,以防止对话片段的结果发送到错误的片段。
1条答案
按热度按时间pgky5nke1#
您应该始终使用
getChildFragmentManager
作为DialogFragment
,如DialogFragment指南中所述:当从Fragment中创建DialogFragment时,必须使用Fragment的子FragmentManager来确保在配置更改后正确恢复状态。