PreferenceFragment中的PreferenceScreen会在ScreenOrientation更改时关闭

时间:2018-11-22 13:44:42

标签: android android-preferences screen-orientation preferencefragment preferencescreen

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

一切正常,但是无论何时旋转设备,PreferenceActivity都会返回到主PreferenceScreen,而无需考虑用户所在的嵌套偏好设置屏幕。

这与前面的这些SO问题完全相同,在该问题中,解决方案是向PreferenceScreen添加一个键:

  1. When my PreferenceActivity rotates, it does not remember which PreferenceScreen was open

  2. How to prevent quitting from inner preference screen when there's a configuration change

  3. Nested Preference Screen closes on Screenorientation change in Android

我已将密钥添加到我的所有PreferenceScreen中,并且该解决方案有效,只要我使用不赞成使用的方式即可:

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

问题是我正在使用PreferenceFragment,就像this SO answer(还有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打开?

我看到对于Google偏好设置now recommends AppCompatActivity和PreferenceFragmentCompat,但是我不希望只使用一个很小的细节就不要使用任何库,甚至不使用Google的库。

1 个答案:

答案 0 :(得分:0)

当Android在API 11下时,这个小问题设法产生了三个SO问题,而在PreferenceFragment被弃用时,在API 11和API 28之间没有一个问题(至少可以找到),我感到非常惊讶。

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

关键是要在添加if (savedInstanceState == null)之前检查PreferenceFragment,如下所示:

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

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