我有兩個方向的佈局 - 1個橫向和1個縱向。屏幕旋轉後,findFragmentById()返回一個片段,即使在佈局中沒有這樣的ID
/layout-land/main.xml
具有兩個片段:
<fragment android:id="@+id/fragment1" .. />
<fragment android:id="@+id/fragment2" .. />
/layout/main.xml
只有一個片段:
<fragment android:id="@+id/fragment1" .. />
這裏的MainActivity.java
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
firstFragment = (FirstFragment) getFragmentManager().findFragmentById(R.id.fragment1);
secondFragment = (SecondFragment) getFragmentManager().findFragmentById(R.id.fragment2);
}
接下來,我開始MainActivity.java
在景觀模式。在這種情況下,
- 兩個
firstFragment
和secondFragment
指片段在佈局layout-land/main.xml
然後我在屏幕旋轉到肖像模式,佈局文件layout/main.xml
應該被加載。在這種情況下,
firstFragment
指R.id.fragment1
secondFragment
referes到一個不存在的片段。訪問裏面的任何元素都會拋出NullPointerException異常。 (更準確地說,是secondFragment
不null
這裏)
如何時,有沒有佈局中定義片段這個secondFragment
初始化?
編輯:在http://developer.android.com/training/basics/fragments/creating.html在Android開發者文檔中找到原因:
當配置變化導致託管這些 片段重新啓動活動,它的新實例可以使用不同的佈局 不包含與之前佈局相同的片段。在這個 的情況下,所有先前的片段仍將被實例化並且在新實例中運行 。但是,與視圖層次結構中的標記關聯的任何不再 的 都不會創建它們的內容視圖,並將從isInLayout()返回false。 (這裏的代碼也顯示瞭如何確定一個片段在容器中放入 在與容器 佈局不再運行,並避免在這種情況下創建其視圖層次)。
你確定第二個片段被初始化,檢查secondFragment == null – viv
@viv是的,它肯定是空的檢查,它不是空的! –
確保正確加載xml,嘗試更改背景,檢查是否在清單中的config參數中沒有添加任何東西 – viv