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

时间:2015-08-18 10:43:14

标签: android android-support-library support-preference

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

似乎没有PreferenceActivity或类似内容,我们如何将其集成到我们的应用中?

5 个答案:

答案 0 :(得分:92)

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

阅读公告here。使用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 /的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>

<强>值/ styles.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>

答案 1 :(得分: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>

答案 2 :(得分:9)

使用新的偏好设置支持库v7,您可以将PreferenceFragmentCompatActivityAppCompatActivity

一起使用
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以设置用于每种首选项类型的布局样式,而不会影响活动的其他部分。

答案 3 :(得分:0)

你是对的,它在appcompat v7上不存在,但Google实际上添加了AppCompatDelegate抽象类作为委托,您可以使用它来向任何活动注入AppCompat的支持。您可以从this answer找到更多信息。

这是一个如何从AppCompat的Google样本中将AppCompatDelegate注入您的活动的示例,您可以找到它here

答案 4 :(得分:0)

我尝试使用一个包含工具栏的活动来实现Hidro上面的答案,并且由于以下错误,它给了我以下布局通胀异常:

  

引起:java.lang.NullPointerException:尝试调用虚拟   方法       &#39; android.content.Context android.support.v4.app.FragmentHostCallback.getContext()&#39;       在空对象引用上

我还没有能够解决这些问题,所以请采取以下措施:

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>

在此发布,因为如果其他人遇到相同的异常可能会有所帮助