最後に、この問題の解決策を見つけました。これはバグではなく、Android開発者向けドキュメントの問題/見落としであることが判明しました。
ほら、私はここでPreferenceFragmentチュートリアルに従っていました。この記事では、アクティビティ内で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が2回作成されるため、状態が失われることです。
最初の作成は、アクティビティの呼び出しsuper.onCreate()
(上に表示)を介して行わonActivityCreated()
れます。これにより、PreferenceFragment()のonRestoreInstanceState()
メソッドと、それに含まれる各Preferenceのメソッドが呼び出されます。これらはすべての状態を正常に復元します。
しかし、returnsを呼び出すと、メソッドがPreferenceFragmentをもう一度作成することsuper.onCreate()
がわかります。再び無意味に作成されるため(そして今回は状態情報なしで!)、正常に復元されたばかりの状態はすべて完全に破棄/失われます。これは、アクティビティが破棄されたときに表示されていた可能性のあるDialogPreferenceが、アクティビティが再作成されると表示されなくなる理由を説明しています。onCreate()
それで、解決策は何ですか?さて、次のように、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()
したがって、ここで学んだ教訓は、アクティビティを初めて設定することも、以前の状態から復元することもできるという2つの役割があることだと思います。
ここでの答えは、私がこの解決策を実現することにつながりました。