如何使用v7/v14首选项支持库?

Ran*_*ku' 53 android android-support-library support-preference

与M版本一起,有新的支持库.其中一个似乎非常有用的是v7 Preference Support库.

它似乎没有PreferenceActivity或类似的东西,我们如何将它集成到我们的应用程序?

hid*_*dro 93

你必须扩展AppCompatActivity,这是片段所必需的,并包括一个子类PreferenceFragmentCompat.抽象片段需要覆盖一个方法,在该方法中您应该放置您的偏好通胀逻辑.最后,您的活动主题需要指定一个preferenceTheme属性.

这里阅读公告.使用preference-v7库,您可以PreferenceFragment使用PreferenceFragmentCompat子类和SwitchPreference(API 14+)替换(API 11+),并使用SwitchPreferenceCompatAPI 7设置屏幕.

以下是我的工作方式:

SettingsActivity.java

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
    }
}
Run Code Online (Sandbox Code Playgroud)

布局/ 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>
Run Code Online (Sandbox Code Playgroud)

SettingsFragment.java

public class SettingsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        addPreferencesFromResource(R.xml.preferences);
    }
}
Run Code Online (Sandbox Code Playgroud)

XML /的preferences.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>
Run Code Online (Sandbox Code Playgroud)

价值观/ styles.xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
    ...
</style>
Run Code Online (Sandbox Code Playgroud)

preference-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>
Run Code Online (Sandbox Code Playgroud)

  • 那么`AppCompatPreferenceActivity`和`onBuildHeaders`和'PreferenceFragmentCompat`怎么样? (3认同)

Jun*_*Cao 12

希德罗的答案是对的,但还有一件事需要注意:

只需使用普通的首选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>
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 9

使用新的首选项支持库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);
    }
}
Run Code Online (Sandbox Code Playgroud)

你必须preferenceTheme在你的主题中设置:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  ...
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以自定义preferenceTheme用于为每种首选项类型设置的布局样式,而不会影响Activity的其他部分.

  • 这是不正确的,导致我30分钟的头痛.`PreferenceFragmentCompat`不应该覆盖`onCreate(Bundle b)`,它应该覆盖`onCreatePreferences(Bundle bundle,String s)` (15认同)