Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在父级onPause和onResume之后,Android片段不可见_Android_Android Fragments - Fatal编程技术网

在父级onPause和onResume之后,Android片段不可见

在父级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

考虑一个Android应用程序,它有一些基本元素:

有一项活动具有重要意义

TabLayout的选项卡是

假设我有4个标签:A、B、C、D

TabLayout可根据需要智能加载其选项卡: 当显示选项卡A时,它也会启动选项卡B,以便在刷卡时提供无缝的用户体验(但C和D尚未加载-即尚未调用它们的onCreate方法)

因此,选项卡D是一个片段。它还包含另一个片段,即子D

下面是我在TabLayout上选择Tab D后TabD和TabD_SUB的小日志:

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();