我确实需要帮助解决我已经困扰了一段时间的问题。几个月前我加入了我的公司。自从迁移 Android 应用程序以来,我一路上面临着许多挑战(主要是由于需要替换或更新代码)。
我最近遇到的问题之一是 FragmentContainerView 的使用。过去该项目非常混乱,现在的目标是简化并提高其性能。这从这里开始。
我的项目有一个 MainActivity。这是启动活动。然后我将另一个片段添加到 Activity 的 FragmentContainerView 中。然后在第一个子片段中,我将有一个选项卡布局,然后添加另一个子片段。
这是主要活动中的:
<androidx.fragment.app.FragmentContainerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mxb_fragment_container" />
当主 Activity 第一次加载时,在 onCreate() 内,我将有一个名为
initHomeFragment()
的函数来添加主屏幕。这个没有任何问题。我分享这个只是为了了解我所面临的问题的更多背景。
当我尝试添加下一个片段(由点击的按钮触发)时,发生了一件非常有趣的事情(经过反复观察):
(调试模式)当我在调试模式下运行应用程序时,后续的子片段(具有子视图的片段)将加载。
(正常模式)当我停止调试并在正常的“运行”模式下运行应用程序时,子片段将不再加载。我只是得到一个空白屏幕。我什至尝试创建一个在加载选项卡相关片段结束时调用的函数。
FragmentContainerView
将显示有 2 个孩子。这是正确的,因为现在已将主页和收藏夹片段添加到容器中。
private void switchFragmentView(Fragment pShowFragment, Fragment pHideFragment, Bundle args, String tag) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setReorderingAllowed(true);
if (pHideFragment != null) {
ft.hide(pHideFragment);
}
if (getSupportFragmentManager().findFragmentByTag(tag) == null) {
if (pShowFragment instanceof MxFavouritesFragment)
ft.add(R.id.mxb_fragment_container, MxFavouritesFragment.class, args, tag);
} else {
ft.show(pShowFragment);
}
ft.commit();
}
里面
MxFavouritesFragment
...
getChildFragmentManager()
.beginTransaction()
.replace(R.id.mxb_fav_main_container, RecentFavouritesFragment.class, null, RecentFavouritesFragment.LOG_TAG)
.commit();
在
MxFavouritesFragment
内部,我使用 FrameLayout
而不是 FragmentContainerView
。我尝试在这里使用相同的容器视图,但效果不佳。
我该怎么做才能确保 UI 正确加载并且不出现空白屏幕?
我按照一些在线提示使用
invalidate()
或 requestLayout()
函数,这应该强制容器重新绘制自身。但由于某种原因,它似乎没有做任何事情(据我所知)。
这不是答案。由于我没有足够的声誉来发表评论,因此我将其发布为答案。一旦你看到这个,请回复这个答案/编辑问题,以便我可以删除它
我想告诉您分享一个可以重现此问题的示例项目