6

我有一个使用以下 PreferenceScreen的android.support.v4.preference.PreferenceFragment :

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
    android:title="Cat1"
    android:key="pref_cat1">
    <ListPreference
        android:key="pref_list1"
        android:title="@string/pref_list1"
        android:dialogTitle="@string/pref_list1"
        android:entries="@array/pref_list1_entries"
        android:entryValues="@array/pref_list1_entries"
        android:defaultValue="@string/pref_list1_default"/>
    <EditTextPreference
        android:key="pref_text2"
        android:title="@string/pref_text2"
        />
</PreferenceCategory>
<PreferenceCategory
    android:title="Cat2"
    android:key="pref_cat2">
    <EditTextPreference
        android:key="pref_text3"
        android:title="@string/pref_text3"
        />
</PreferenceCategory>

显示 PreferenceFragment 时,一些分隔符显示在首选项之间,但也在每个 PreferenceCategory 的名称下。虽然我可以通过访问 PreferenceFragment 的 ListView 轻松修改首选项之间分隔线的颜色,但这对 PreferenceCategory 分隔线没有影响。

如何也改变这种分隔线的颜色?

4

3 回答 3

8

我的Prefernces文件中有同样的问题。我通过以下步骤解决了它:

1:定义文件名preferences_category.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+android:id/title"
        style="?android:attr/listSeparatorTextViewStyle"

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical" />

    <View style="@style/Divider" />

</LinearLayout>

2:style在样式xml文件中定义:

<style name="Divider">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">1dp</item>
    <item name="android:background">@android:color/white</item>
</style>

3:在xml文件中添加preferences_category.xml文件作为android:layout属性preferences::

 <PreferenceCategory 
    android:title="My title"
    android:layout="@layout/preferences_category">
于 2015-09-17T10:03:30.460 回答
5

你有两个选择:

  1. listSeparatorTextViewStyle在应用的主题中定义

请注意,依赖此主题属性的任何其他内容也将更改为使用您定义的样式。如果你没问题,它看起来像这样:

<style name="AppTheme" parent="android:...">
    ...
    <item name="android:listSeparatorTextViewStyle">@style/ListSeparatorText</item>
</style>

<style name="ListSeparatorText" parent="android:Widget.TextView"><!--parent is optional -->
    <item name="android:background">...</item>
    ...
</style>
  1. 为您的 PreferenceCategories 定义自定义布局

a 的默认布局PreferenceCategory只是一个 TextView。您可以根据需要使布局变得简单或复杂,但某个地方应该是 TextView ,android:id="@android:id/title"以便自动绑定标题。

一旦你有了一个布局,android:layout在你的偏好 xml 中使用该属性:

<PreferenceCategory
    android:title="Cat2"
    android:key="pref_cat2"
    android:layout="@layout/my_pref_category">
    ...
</PreferenceCategory>

或者,您可以preferenceCategoryStyle在应用程序的主题中定义 ,在这种情况下,您根本不需要android:layout在您的偏好 xml 中使用。

<style name="AppTheme" parent="android:...">
    ...
    <item name="android:preferenceCategoryStyle">@style/PreferenceCategoryStyle</item>
</style>

<style name="PreferenceCategoryStyle" parent="android:Preference.Category">
    <item name="android:layout">@layout/my_pref_category</item>
    ...
</style>
于 2015-07-14T23:14:19.563 回答
1

现在您还可以在代码中为您的分隔线设置自定义可绘制对象。我不确定旧版本的支持库,但至少现在使用 AndroidX 它对我有用。

在你的PreferenceFragmentCompat你可以添加:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setDivider(getResources().getDrawable(R.drawable.your_divider_drawable, requireActivity().getTheme()));
}

您也可以致电setDivider(null)删除分隔符。

于 2019-12-11T13:44:24.533 回答