在父级onPause和onResume之后,Android片段不可见
考虑一个Android应用程序,它有一些基本元素: 有一项活动具有重要意义 TabLayout的选项卡是 假设我有4个标签:A、B、C、D TabLayout可根据需要智能加载其选项卡: 当显示选项卡A时,它也会启动选项卡B,以便在刷卡时提供无缝的用户体验(但C和D尚未加载-即尚未调用它们的onCreate方法) 因此,选项卡D是一个片段。它还包含另一个片段,即子D 下面是我在TabLayout上选择Tab D后TabD和TabD_SUB的小日志:在父级onPause和onResume之后,Android片段不可见,android,android-fragments,Android,Android Fragments,考虑一个Android应用程序,它有一些基本元素: 有一项活动具有重要意义 TabLayout的选项卡是 假设我有4个标签:A、B、C、D TabLayout可根据需要智能加载其选项卡: 当显示选项卡A时,它也会启动选项卡B,以便在刷卡时提供无缝的用户体验(但C和D尚未加载-即尚未调用它们的onCreate方法) 因此,选项卡D是一个片段。它还包含另一个片段,即子D 下面是我在TabLayout上选择Tab D后TabD和TabD_SUB的小日志: TabD_Fragment: onAtt
TabD_Fragment: onAttach
TabD_Fragment: onCreate
TabD_Fragment: onCreateView
TabD_Fragment: onResume
TabD_SUBFragment: TabD_SUBFragment Constructor
TabD_SUBFragment: onAttach
TabD_SUBFragment: onCreate
TabD_SUBFragment: onCreateView
TabD_SUBFragment: onStart
TabD_SUBFragment: onResume
// NOW TabD_SUBFragment is visible
// Let's switch to TabC...
TabD_Fragment: onPause
// ...and go back to TabD
TabD_Fragment: onResume
// Now TabD_SUBFragment is visible
// Let's switch to TabB...
TabD_Fragment: onPause
TabD_Fragment: onStop
// Now switch back to TabD
TabD_Fragment: onCreateView
TabD_Fragment: onResume
// And now TabD_SUBFragment is NOT VISIBLE!
所以很明显,无论是在TabD的onStop中,还是在其onCreateView中,都会发生一些阻止我的子片段可见的事情
以下是TabD的顶部:
以下是TabD的onCreateView:
下面是如何在TabD的onResume中构造子片段:
如果我将此代码添加到TabD的onPause中,它解决了此问题,但主要在方向更改期间引入了新代码:
getActivity().getSupportFragmentManager().beginTransaction().remove(mSubDFragment).commit();
因此,我的问题是,不删除子片段,如何确保在选择选项卡D时它将被附加并可见?将片段添加到另一个片段中时,应该使用
getChildFragmentManager()
而不是getActivity().getSupportFragmentManager()
。您在选项卡片段中尝试过这种方法吗?使用getActivity().getSupportFragmentManager()
创建子片段而不是getChildFragmentManager()
?
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.i(LOG_TAG, "onCreateView");
return inflater.inflate(R.layout.fragment_tabD, container, false);
}
@Override
public void onResume() {
Log.i(LOG_TAG, "onResume");
super.onResume();
if (null == mSubDFragment) mSubDFragment = new SubDFragment();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.subd_holder, mSubDFragment).commit();
}
getActivity().getSupportFragmentManager().beginTransaction().remove(mSubDFragment).commit();