最後找出瞭解決方案oblem。事實證明,這不是一個錯誤,而是Android開發人員文檔中的問題/疏漏。
你看,我正在按照PreferenceFragment教程here。這篇文章告訴你這樣做,以便在活動中實例化PreferenceFragment如下:
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
這樣做的問題是,當您更改屏幕方向(或破壞並重新創建活動的任何其他行動),您的PreferenceFragment將創建兩次,這是導致它失去其狀態的原因。
的第一創建將經由活動的呼叫發生super.onCreate()
(如上所示),這將調用你PreferenceFragment()的onActivityCreated()
方法和它包含的每個偏好的onRestoreInstanceState()
方法。這些將成功恢復一切狀態。
但隨後一旦調用super.onCreate()
返回時,你可以看到onCreate()
方法然後繼續創建PreferenceFragment一個第二時間。因爲它再次被毫無意義地創建(並且這次沒有狀態信息!),所有剛被成功恢復的狀態將被完全丟棄/丟失。這就解釋了爲什麼一旦活動被重新創建,在Activity被銷燬時可能顯示的DialogPreference將不再可見。
那麼有什麼解決方案?好了,只需添加一個小的檢查,以確定是否PreferenceFragment已經創建,就像這樣:
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fragment existingFragment = getFragmentManager().findFragmentById(android.R.id.content);
if (existingFragment == null || !existingFragment.getClass().equals(SettingsFragment.class))
{
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
}
或者另一種方式是簡單地檢查是否onCreate()
是爲了恢復狀態或沒有,像這樣:
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null)
{
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
}
所以我想這裏學到的教訓是,onCreate()
有一個雙重角色 - 它可以第一次設置一個活動,或者它可以從早期狀態恢復。
答案here讓我意識到這個解決方案。
第三個選項是檢查「第一個」onCreate執行的標準方法 – SeanPONeil
你會怎麼做? –
if(savedInstanceState == null){}該語句只會在第一次創建Activity時解析爲true – SeanPONeil