终于想出了解决这个问题的办法。事实证明这不是错误,而是 Android 开发人员文档中的问题/疏忽。
你看,我在这里关注 PreferenceFragment 教程。那篇文章告诉您执行以下操作以在 Activity 中实例化您的 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();
}
}
这样做的问题是,当您更改屏幕方向(或任何其他破坏并重新创建 Activity 的操作)时,您的 PreferenceFragment 将被创建两次,这就是导致它失去其状态的原因。
第一次创建将通过 Activity 的调用发生super.onCreate()
(如上所示),它将调用onActivityCreated()
PreferenceFragment () 的onRestoreInstanceState()
方法及其包含的每个 Preference 的方法。这些将成功恢复一切的状态。
但是一旦该调用super.onCreate()
返回,您可以看到该onCreate()
方法将继续第二次创建 PreferenceFragment。因为它再次被毫无意义地创建(这一次,没有状态信息!),所有刚刚成功恢复的状态都将被完全丢弃/丢失。这解释了为什么在 Activity 被销毁时可能显示的 DialogPreference 在重新创建 Activity 后将不再可见。
那么解决方案是什么?好吧,只需添加一个小检查以确定 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()
有双重作用——它可以第一次设置一个活动,或者它可以从早期的状态恢复。
这里的答案让我意识到了这个解决方案。