与 M 版本一起,还有新的支持库。其中一个似乎非常有用的是v7 Preference Support库。
它似乎没有PreferenceActivity
或类似的东西,我们如何将它集成到我们的应用程序中?
与 M 版本一起,还有新的支持库。其中一个似乎非常有用的是v7 Preference Support库。
它似乎没有PreferenceActivity
或类似的东西,我们如何将它集成到我们的应用程序中?
您必须扩展AppCompatActivity
片段所需的 ,并包含 的子类PreferenceFragmentCompat
。抽象片段需要覆盖一种方法,您应该在其中放置您的偏好膨胀逻辑。最后,您的活动主题需要指定一个preferenceTheme
属性。
在此处阅读公告。使用 preference-v7 库,您可以将PreferenceFragment
(API 11+)替换为PreferenceFragmentCompat
子类,将SwitchPreference
(API 14+) 替换SwitchPreferenceCompat
为 API 7 并让您的设置屏幕正常工作。
以下是我如何使它工作的:
SettingsActivity.java
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
}
}
布局/activity_settings.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" >
<fragment
android:name=".SettingsFragment"
android:tag=".SettingsFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
SettingsFragment.java
public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preferences);
}
}
xml/首选项.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v7.preference.PreferenceCategory
...>
<android.support.v7.preference.ListPreference
... />
<android.support.v7.preference.SwitchPreferenceCompat
... />
...
</android.support.v7.preference.PreferenceCategory>
...
</android.support.v7.preference.PreferenceScreen>
值/样式.xml
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
...
</style>
首选项-v7 默认主题
<style name="PreferenceThemeOverlay">
<item name="preferenceScreenStyle">@style/Preference.PreferenceScreen</item>
<item name="preferenceFragmentStyle">@style/PreferenceFragment</item>
<item name="preferenceCategoryStyle">@style/Preference.Category</item>
<item name="preferenceStyle">@style/Preference</item>
<item name="preferenceInformationStyle">@style/Preference.Information</item>
<item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference</item>
<item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item>
<item name="dialogPreferenceStyle">@style/Preference.DialogPreference</item>
<item name="editTextPreferenceStyle">@style/Preference.DialogPreference.EditTextPreference</item>
<item name="preferenceFragmentListStyle">@style/PreferenceFragmentList</item>
</style>
hidro 的回答是正确的,但这里还有一件事需要注意:
只需使用普通的偏好 xml 标记,例如PreferenceScreen
代替完整的类名。支持库会自动转换它们。
原因:如果您使用完整的类名,代码建议和布局预览将无法正常工作。
所以你应该这样写xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
...>
<ListPreference
... />
<SwitchPreferenceCompat
... />
...
</PreferenceCategory>
...
</PreferenceScreen>
使用新的首选项支持库 v7,您可以将PreferenceFragmentCompat与任何Activity
或AppCompatActivity
public static class PrefsFragment extends PreferenceFragmentCompat {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
您必须preferenceTheme
在主题中设置:
<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
...
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
通过这种方式,您可以自定义preferenceTheme
样式以设置用于每种首选项类型的布局,而不会影响 Activity 的其他部分。
我试图用一个还包含一个工具栏的活动来实现上面 Hidro 的答案,由于以下错误,它给了我以下布局膨胀异常:
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.Context android.support.v4.app.FragmentHostCallback.getContext()'
我一直无法解决这些问题,所以采取了以下措施:
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null)
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new SettingsFragment()).commit();
}
}
SettingsActivity 的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<include layout="@layout/toolbar"/>
<FrameLayout android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
在此处发布,因为如果其他人遇到相同的异常可能会有所帮助