2013-03-05 85 views
1

我有一个FragmentActivity和两个Fragment s,说FrgMaster(a ListFragment)和FrgDetail。我有两个布局XML文件:一个包含单个FrameLayout(用于纵向模式),另一个包含两个FrameLayout(用于横向)。我想实例化我FragmentActivity的片段,在onCreate()我有类似:片段活动:正确的片段实例

if (savedInstanceState == null) { 
    final FrgMaster fragment = new FrgMaster(); 
    // Add the fragment to the FrameLayout 
    this.getSupportFragmentManager() 
      .beginTransaction() 
      .add(R.id.frame_for_master, fragment, FrgMaster.MY_TAG) 
      .commit(); 
} 

我浏览列表,点击的地方。现在,当我改变方向时,上面的代码不起作用,因为savedInstanceState不是null;因此片段不会添加到布局中。如果我删除if条件,则最终会生成多个片段,每个片段对应于一个方向更改,堆叠。

我错过了什么?

+0

“现在,当我改变方向时,上面的代码不起作用,因为savedInstanceState不为空;因此片段不会添加到布局中“ - 它应该作为正常配置更改处理的一部分自动重新添加到布局。见https://github.com/commonsguy/cw-omnibus/tree/master/LargeScreen/EU4You – CommonsWare 2013-03-05 00:51:57

+0

我不确定你的意思。你提出另一种方法?这是我不应该做的事情? – denispyr 2013-03-05 00:58:12

+0

不,更多的是你可能应该工作,但我倾向于使用科里斯科特在他的答案中。 – CommonsWare 2013-03-05 01:07:09

回答

2

它不清楚你是否在布局文件中包含片段的链接。 如果你是那么你根本不需要beginTransacton()。add(x).commit()部分。

假设你是不是在XML中添加片段,只在代码中你可能会得到一些里程从改变你的代码如下:

FragmentManager manager = this.getSupportFragmentManager(); 
FrmMaster fragment = manager.findFragmentById(FrgMaster.MY_TAG); 
if (fragment == null) 
{ 
    manager 
     .beginTransaction() 
     .add(R.id.frame_for_master, fragment, FrgMaster.MY_TAG) 
     .commit(); 
} 

编辑:更改语法遵循OP的风格

+0

您的语法稍微偏离了事务 - 'add()'和'commit()'将被链接在'beginTransaction()'上,因为它是一个流畅的接口。这就是说,你的意图是发现。 – CommonsWare 2013-03-05 01:06:27

+0

这是对的。 @denispyr:或者你可以使用它来防止屏幕方向改变后你的活动被重新创建:'android:configChanges =“orientation | screenSize | keyboardHidden | keyboard”'(将它设置为'AndroidManifest.xml'中的''元素' )。 – 2013-03-05 01:07:18

+0

@CommonsWare感谢您的输入,我将它改为OP的风格。对我而言,我更喜欢其他风格,是否有任何理由使用其中一种?还是仅仅是个人喜好? – 2013-03-05 01:17:41