2014-09-22 82 views
4

我有一個頁面和一個FragmentStatePagerAdapter裏面的活動(我需要滑過很多頁面)。衆所周知,該適配器一次創建3個片段實例,即要顯示的片段實例,前一個和下一個片段實例。Android碎片:是空的構造函數真的需要嗎?

我的活動使用只有一個構造函數的片段效果非常好:它收到1個參數。測試時,我開始變得臭名昭著消息:

Unable to instantiate fragment: make sure class name exists, is public, 
and has an empty constructor that is public 

有趣的是,這個消息只是方向更改後正確顯示出來,但如果方向保持靜止的應用只是工作。所以,

  1. 爲什麼它的工作方向不會改變?
  2. 爲什麼方向改變時會失敗?
  3. 定向變化與剛剛創建的活動相比,片段生命週期中活動的差異是什麼?

非常感謝

回答

12

是空的構造真正需要的?

是的。

爲什麼它在方向不變時工作?

因爲Android沒有嘗試重新創建您的碎片。

爲什麼在方向改變時會失敗?

因爲Android正在重新創建您的碎片。

當發生配置更改(例如,方向更改)時,默認情況下Android會銷燬並重新創建您的活動,並破壞並重新創建該活動中的片段。 「重新創建片段」部分就是爲什麼你需要片段上的零參數公共構造函數。它也用於其他情況,例如FragmentStatePagerAdapter

或者引用the documentation

片段的所有子類都必須包括一個公共的空構造。框架通常會在需要時重新實例化一個片段類,特別是在狀態恢復期間,並且需要能夠找到這個構造器來實例化它。如果空的構造函數不可用,則在狀態恢復期間會發生運行時異常。

+0

如果是這樣,爲什麼框架在重新創建活動和片段時遵循不同的步驟。我的意思是,如果碎片和活動被破壞,爲什麼不按照第一次採取的相同的創作步驟? – 2014-09-23 14:24:08

+2

@Mark:因爲它不能。 *您*在您的代碼*中第一次創建了片段。 Android不是你。 Android無法在您的代碼中識別出執行'FragmentTransactions'的隨機語句,更不用說以某種方式重播這些語句。 – CommonsWare 2014-09-23 14:26:19

+0

我的意思是,框架正在破壞活動及其內部碎片。爲什麼不重新運行相同的代碼,就像創建第一次一樣? – 2014-09-23 20:33:46