gpt4 book ai didi

Android fragment 在父 onPause 和 onResume 之后不可见

转载 作者:行者123 更新时间:2023-11-29 18:25:55 25 4
gpt4 key购买 nike

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

有一项 Activity 持有 TabLayout .

TabLayout 的标签是 Fragments .

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

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

因此,Tab D 是一个 fragment 。它还包含另一个 fragment ,即 Sub 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 中,发生了一些事情,阻止了我的子 fragment 可见。

这是 TabD 的 onStop:

@Override
public void onStop() {
Log.i(LOG_TAG, "onStop");
super.onStop();
}

这是 TabD 的 onCreateView:

@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);
}

下面是如何在 TabD 的 onResume 中构建子 fragment :

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

如果我将此代码添加到 TabD 的 onPause 中,它会解决这个问题,但主要是在方向更改期间引入新的代码:

getActivity().getSupportFragmentManager().beginTransaction().remove(mSubDFragment).commit();

所以,我的问题是,不是删除子 fragment ,而是如何确保在选择选项卡 D 时它会被附加并可见?

最佳答案

将一个 fragment 添加到另一个 fragment 时,您应该使用 getChildFragmentManager() 而不是 getActivity().getSupportFragmentManager()。您是否在您的 TabD fragment 中尝试过这种方式?

关于Android fragment 在父 onPause 和 onResume 之后不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59060533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com