PreferenceFragment 中的 PreferenceScreen 在 ScreenOrientation 更改时关闭
PreferenceScreen in PreferenceFragment closing on ScreenOrientation change
我的 PreferenceActivity
中嵌套了一些 PreferenceScreen
,在它们下面是一系列 CheckBoxPreference
。
一切正常,但无论何时旋转设备,PreferenceActivity returns 都会转到主 PreferenceScreen
,而不管用户所在的嵌套首选项屏幕如何。
这与之前的 SO 问题完全一样,解决方案是向 PreferenceScreen 添加一个键:
我已将键添加到我的所有 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
值。
我的 PreferenceActivity
中嵌套了一些 PreferenceScreen
,在它们下面是一系列 CheckBoxPreference
。
一切正常,但无论何时旋转设备,PreferenceActivity returns 都会转到主 PreferenceScreen
,而不管用户所在的嵌套首选项屏幕如何。
这与之前的 SO 问题完全一样,解决方案是向 PreferenceScreen 添加一个键:
我已将键添加到我的所有 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
值。