重新膨胀不同的布局在onResume中的相同片段中查看

时间:2015-07-11 17:42:16

标签: android

我有MainFragmentlayout_3,可以包含两个,三个或四个嵌套片段。用户可以在设置中更改将显示的特定片段。

每个片段数都有不同的布局。例如,当用户选择三个嵌套片段时,将使用MainFragment

我需要做的是动态更新onResume()的布局,以及哪些片段将嵌套在该布局中,MainFragment一旦用户回来从设置)。用户可以选择大约10个片段,我需要能够动态地将它们交换进MainFragment

我在做这件事时遇到了麻烦。从设置返回后更新布局/视图的唯一方法是离开onCreateView()然后返回(调用onCreateView())。

以下是我在mView = mInflater.inflate(R.layout.layout_2, mParent, false); getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer1, fragment1).commit(); getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer2, fragment2).commit(); return view; 中初始化布局的示例(两个嵌套片段是默认设置):

onResume()

假设用户然后转到设置并选择有三个嵌套片段。这就是我在mView = mInflater.inflate(R.layout.layout_3, mParent, false); getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer1, fragment1)).commit(); getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer2, fragment2).commit(); getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer3, fragment3).commit(); 中尝试过的,没有效果:

MainFragment

我不确定我做错了什么。理想情况下,我只会强制onCreateView()再次致电View,但这个问题的解决方案似乎都无效。

有什么想法吗?谢谢你的帮助。

编辑:我认为问题在于膨胀新的layout_4,而不是替换片段。

例如,假设默认屏幕为onResume(),带有四个片段容器。然后用户转到设置取消检查所有四个默认片段,并选择三个新片段。在layout_3中,我们尝试对layout_3进行充气,然后添加片段。我认为id永远不会膨胀,但是因为我的片段容器在布局中具有相同的样式fragmentContainer1 fragmentContainer4 - {{ 1}}),更新前三个片段容器。第四个保持不变,因为我假设我们在layout_3并且没有尝试更新它。

当用户尝试增加片段数而不是减少时,此行为已得到确认并导致崩溃。上面,当用户从四个片段切换到三个片段时,没有崩溃,因为我尝试更新的所有三个片段容器都存在于layout_4中。但是如果用户在layout_2中,然后转到设置以选择第三个片段,我们将在恢复时尝试将片段添加到fragmentContainer3。这会导致崩溃,因为layout_3无法充气。

java.lang.RuntimeException: Unable to resume activity

java.lang.IllegalArgumentException: No view found for id 0x7f0c005f

任何想法如何解决这个问题? mView中重新充气onResume()的调用似乎没有任何效果。

编辑2:我在尝试充气后尝试调用mParent.addView(mView),但在大多数情况下仍然会遇到与上述相同的行为。

1 个答案:

答案 0 :(得分:0)

当您从设置中返回时,应在onResume()中调用MainFragment,随后在MainFragment中加载任何已嵌套的片段。您是否可以在嵌套片段onResume()中不包含任何更新逻辑,而不仅仅在onCreateView()中?

否则,您可以创建不同的代码路径并将更新逻辑放在那里:在包含所有更新逻辑的fragment1fragment2fragment3的类中创建公共方法,并调用来自MainFragment某处的那些方法。 (您可以创建一个接口,让嵌套的片段类继承该接口,如果它们是不同的类,并且您希望设计更清晰。)

当嵌套片段“onResume()尚未被调用但尚未出现问题时,请注意嵌套片段是否已恢复尚未调用View对象上的方法。”