我有MainFragment
,layout_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)
,但在大多数情况下仍然会遇到与上述相同的行为。
答案 0 :(得分:0)
当您从设置中返回时,应在onResume()
中调用MainFragment
,随后在MainFragment
中加载任何已嵌套的片段。您是否可以在嵌套片段onResume()
中不包含任何更新逻辑,而不仅仅在onCreateView()
中?
否则,您可以创建不同的代码路径并将更新逻辑放在那里:在包含所有更新逻辑的fragment1
,fragment2
,fragment3
的类中创建公共方法,并调用来自MainFragment
某处的那些方法。 (您可以创建一个接口,让嵌套的片段类继承该接口,如果它们是不同的类,并且您希望设计更清晰。)
当嵌套片段“onResume()
尚未被调用但尚未出现问题时,请注意嵌套片段是否已恢复尚未调用View对象上的方法。”