当我启动我的应用时,会运行AsyncTask
加载,然后在onPostExecute
,然后我setContentView
到新布局然后添加一个带有两个按钮的片段,提供两种模式添加FragmentTransaction
。单击两种模式中的一种后,它会使用replace方法将片段替换为另一种FragmentTransaction
。
如果应用程序崩溃,它将返回第一个屏幕,加载提供两种模式的两个按钮。在这种情况下,如果选择了任一模式,则加载第二个片段,但现在背景突然透明,显示下面的两个按钮,它们仍然可以点击。如果再次单击它们,它们会正确替换片段,以便在下面看不到它。这很奇怪,我无法理解是什么原因引起的。
我研究并看到了这两个类似的问题,one和two,这些问题可能是因为ID错误或者我用XML定义了这个片段。这两个因素都不是这样的。
我的代码如下所示:
下面我更换加载屏幕。
@Override
protected void onPostExecute(Void result) {
setContentView(R.layout.activity_main_screen);
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.add(R.id.fragment_container, new ModeFragment())
.commit();
}
之后,当点击一个按钮时,我将希望替换当前的片段传递给下面的方法:
private void replaceCurrentFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.fragment_container, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null).commit();
}
这是第一次使用,但是如果发生崩溃,那么应用程序返回到第一个片段,第二次传递此方法时,新的替换片段是半不可见的。单击第一个片段上的按钮再次调用此方法,现在它已经很好了。
显然我不希望应用程序崩溃所以不应该发生这种情况,但我觉得我的代码编写方式有问题。
答案 0 :(得分:11)
我遇到了同样的问题,这是因为我在我的Activity的OnCreate中加载了一个片段,没有检查是否有savedInstanceState,所以android首先重新打开所有旧片段,然后执行OnCreate,它将片段添加到旧的而不替换它们所以当你导航到另一个片段时,它只替换顶部片段,而不是底部片段,所以你会看到它下面的片段。
对你来说可能不是完全一样的东西,但它可能会帮助你搞清楚。