2013-03-05 110 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