PreferenceFragment 中的 PreferenceScreen 在 ScreenOrientation 更改时关闭

PreferenceScreen in PreferenceFragment closing on ScreenOrientation change

我的 PreferenceActivity 中嵌套了一些 PreferenceScreen,在它们下面是一系列 CheckBoxPreference

一切正常,但无论何时旋转设备,PreferenceActivity returns 都会转到主 PreferenceScreen,而不管用户所在的嵌套首选项屏幕如何。

这与之前的 SO 问题完全一样,解决方案是向 PreferenceScreen 添加一个键:

  1. 当我的PreferenceActivity旋转时,它不记得是哪个 PreferenceScreen 已打开

  2. 如何防止在有 配置更改

  3. 嵌套首选项屏幕在屏幕方向更改时关闭 Android

我已将键添加到我的所有 PreferenceScreen,并且解决方案有效,只要我使用已弃用的方式:

public class Settings extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
    }
}

问题是我使用的是 PreferenceFragment,例如 this SO answer (and also here)。

代码:

public class Settings extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getFragmentManager().
            beginTransaction().
            replace(android.R.id.content, new MyPreferenceFragment()).
            commit();
}

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.prefs);
        }
    }
}

那么,如何在屏幕方向更改后保持内部 PreferenceScreen 打开(如果可能的话)?

我看到 Preferences Google now recommends AppCompatActivity 和 PreferenceFragmentCompat,但我宁愿不使用任何库,甚至不使用 Google,特别是对于这么小的细节。

我很惊讶这个小问题设法产生了三个 SO 问题,而 Android 在 API 11 之下,而 none - 我至少可以找到 - 在 API 11 和 API 28,当 PreferenceFragment 被弃用时。

无论如何,我也在 SO 中找到了解决方案,在对 Android- deprecated method warning regarding PreferenceActivity 的回答中。

关键是在添加PreferenceFragment之前检查if (savedInstanceState == null),像这样:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null)
        getFragmentManager().
                beginTransaction().
                replace(android.R.id.content, new MyPreferenceFragment()).
                commit();
}

现在,当屏幕方向改变时,嵌套的 PreferenceScreen 保持打开状态,当然,只要它设置了 android:key 值。