PreferenceActivity 与多个 PreferenceScreens 没有 Headers
PreferenceActivity with multiple PreferenceScreens without Headers
我想做一个普通的 PreferenceActivity(旧样式,没有 headers),但有片段并且没有使用 addPreferencesFromResource(id)
(因为弃用)。
现在我通过把它放在我的 onCreate
:
中实现了这个
getFragmentManager().beginTransaction().replace(android.R.id.content, new PreferencesFragment()).commit();
我的 PreferencesFragment
看起来像这样:
public static class PreferencesFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
显然我也实现了isValidFragment
方法:
@Override
protected boolean isValidFragment(String fragmentName) {
return PreferencesFragment.class.getName().equals(fragmentName)
|| InnerFragment.class.getName().equals(fragmentName);
}
它工作得很好。但是,当我的 preferences.xml
:
中包含 PreferenceScreen
时出现问题
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ... -->
<PreferenceScreen android:fragment="net.chaozspike.batterynotifier.SettingsActivity$InnerFragment"
android:summary="@string/settings_activity_prefs_display_night_mode_sum"
android:title="@string/settings_activity_prefs_display_night_mode" />
<!-- ... -->
</PreferenceScreen>
我遇到以下问题:新的首选项屏幕显示在正常屏幕之上,我知道这可能是因为我替换了默认设置 R.id.content
。截图:
但是我想在不使用不推荐使用的东西或 headers 的情况下解决这个问题。这有可能实现吗?
我自己发现了解决方案。如果我不打算制作 fragment-based、header-based SettingsActivity,但仍不想使用已弃用的方法,那么除了用于替换主要内容的片段外,我根本不能使用片段看法。换句话说,我必须删除 InnerFragment
,因此我也可以删除 isValidFragment
方法。我将另一个 XML 文件中的所有代码移动到第一个文件中,如下所示:
第一个文件(旧):
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ... -->
<PreferenceScreen android:fragment="net.chaozspike.batterynotifier.SettingsActivity$InnerFragment"
android:summary="@string/settings_activity_prefs_display_night_mode_sum"
android:title="@string/settings_activity_prefs_display_night_mode" />
<!-- ... -->
</PreferenceScreen>
第一个文件(新):
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ... -->
<PreferenceScreen android:summary="@string/settings_activity_prefs_display_night_mode_sum"
android:title="@string/settings_activity_prefs_display_night_mode" >
<!-- Contents of second file here>
<CheckBoxPreference /> etc.
</PreferenceScreen>
<!-- ... -->
</PreferenceScreen>
只需使用 PreferenceActivity.EXTRA_SHOW_FRAGMENT
和 PreferenceActivity.EXTRA_NO_HEADERS
即可仅显示一个片段并跳过 headers:
//Note #1: ExtendedPreferenceActivity extends PreferenceActivity
//Note #2: ExtendedPreferenceFragment extends PreferenceFragment and is
//declared as an inner static class in ExtendedPreferenceActivity
Intent intent = new Intent(context, ExtendedPreferenceActivity.class );
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, ExtendedPreferenceActivity.ExtendedPreferenceFragment.class.getName() );
intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true );
startActivity(intent);
我想做一个普通的 PreferenceActivity(旧样式,没有 headers),但有片段并且没有使用 addPreferencesFromResource(id)
(因为弃用)。
现在我通过把它放在我的 onCreate
:
getFragmentManager().beginTransaction().replace(android.R.id.content, new PreferencesFragment()).commit();
我的 PreferencesFragment
看起来像这样:
public static class PreferencesFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
显然我也实现了isValidFragment
方法:
@Override
protected boolean isValidFragment(String fragmentName) {
return PreferencesFragment.class.getName().equals(fragmentName)
|| InnerFragment.class.getName().equals(fragmentName);
}
它工作得很好。但是,当我的 preferences.xml
:
PreferenceScreen
时出现问题
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ... -->
<PreferenceScreen android:fragment="net.chaozspike.batterynotifier.SettingsActivity$InnerFragment"
android:summary="@string/settings_activity_prefs_display_night_mode_sum"
android:title="@string/settings_activity_prefs_display_night_mode" />
<!-- ... -->
</PreferenceScreen>
我遇到以下问题:新的首选项屏幕显示在正常屏幕之上,我知道这可能是因为我替换了默认设置 R.id.content
。截图:
但是我想在不使用不推荐使用的东西或 headers 的情况下解决这个问题。这有可能实现吗?
我自己发现了解决方案。如果我不打算制作 fragment-based、header-based SettingsActivity,但仍不想使用已弃用的方法,那么除了用于替换主要内容的片段外,我根本不能使用片段看法。换句话说,我必须删除 InnerFragment
,因此我也可以删除 isValidFragment
方法。我将另一个 XML 文件中的所有代码移动到第一个文件中,如下所示:
第一个文件(旧):
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ... -->
<PreferenceScreen android:fragment="net.chaozspike.batterynotifier.SettingsActivity$InnerFragment"
android:summary="@string/settings_activity_prefs_display_night_mode_sum"
android:title="@string/settings_activity_prefs_display_night_mode" />
<!-- ... -->
</PreferenceScreen>
第一个文件(新):
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ... -->
<PreferenceScreen android:summary="@string/settings_activity_prefs_display_night_mode_sum"
android:title="@string/settings_activity_prefs_display_night_mode" >
<!-- Contents of second file here>
<CheckBoxPreference /> etc.
</PreferenceScreen>
<!-- ... -->
</PreferenceScreen>
只需使用 PreferenceActivity.EXTRA_SHOW_FRAGMENT
和 PreferenceActivity.EXTRA_NO_HEADERS
即可仅显示一个片段并跳过 headers:
//Note #1: ExtendedPreferenceActivity extends PreferenceActivity
//Note #2: ExtendedPreferenceFragment extends PreferenceFragment and is
//declared as an inner static class in ExtendedPreferenceActivity
Intent intent = new Intent(context, ExtendedPreferenceActivity.class );
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, ExtendedPreferenceActivity.ExtendedPreferenceFragment.class.getName() );
intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true );
startActivity(intent);