2015-07-11 86 views
2

我有一个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),但大部分仍然会遇到与上面相同的行为。

回答

0

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

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

请注意嵌套片段是否已恢复尚未调用当嵌套片段'onResume()尚未被调用时,View对象上的方法可能会产生问题。

+0

对不起,如果我不清楚。嵌套的片段实际上永远不需要从'MainFragment'中自己更新 - 他们自己处理它们。我需要更新的是*哪些片段将嵌套在MainFragment的布局中。有大约10个片段的列表供用户选择,我需要动态地将它们交换出来。 – pez

+1

啊,我误解了。通常简单地添加到片段管理器,就像你一样,应该在'onResume()'中工作。 (然而,在你的问题中,你有两个右括号'fragment1))' - 这将是一个语法错误 - 这是你的原始代码?)你可以尝试的一件事是创建一个Handler并调用Handler的postDelayed方法, fragmentManager添加代码并延迟100-1000ms。如果可行,这意味着在'onResume()'中添加片段时出现问题。这会让我感到惊讶,但在某些情况下(例如'ListView'),我也遇到过类似的错误,我想我会提到它。 – Laogeodritt