我有一个Fragment
,MainFragment
,它可以包含两个,三个或四个嵌套片段。用户可以在设置中更改将显示的特定片段。重新膨胀不同的布局查看同一片段onResume
每个片段数量都有不同的布局。例如,当用户选择三个嵌套片段时使用layout_3
。
我需要做的是动态更新MainFragment
的布局,以及所述片段将被嵌套在该布局中,在onResume()
(即一旦用户从设置回来)。大约有10个片段供用户选择,我需要能够动态地将它们交换出MainFragment
。
我在做这件事时遇到了麻烦。一旦我从设置中返回,更新布局/视图的唯一方法是离开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
),前三个片段容器被更新。第四个保持原样,因为我认为我们在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
任何想法如何解决这一问题?在onResume()
中重拨mView
的呼叫似乎没有任何效果。
编辑2:我试过在充气后试过呼叫mParent.addView(mView)
,但大部分仍然会遇到与上面相同的行为。
对不起,如果我不清楚。嵌套的片段实际上永远不需要从'MainFragment'中自己更新 - 他们自己处理它们。我需要更新的是*哪些片段将嵌套在MainFragment的布局中。有大约10个片段的列表供用户选择,我需要动态地将它们交换出来。 – pez
啊,我误解了。通常简单地添加到片段管理器,就像你一样,应该在'onResume()'中工作。 (然而,在你的问题中,你有两个右括号'fragment1))' - 这将是一个语法错误 - 这是你的原始代码?)你可以尝试的一件事是创建一个Handler并调用Handler的postDelayed方法, fragmentManager添加代码并延迟100-1000ms。如果可行,这意味着在'onResume()'中添加片段时出现问题。这会让我感到惊讶,但在某些情况下(例如'ListView'),我也遇到过类似的错误,我想我会提到它。 – Laogeodritt