主题偏好FragmentCompat

Theming PreferenceFragmentCompat

我在将主题设置为 PreferenceFragmentCompat 时遇到了一些问题:

我设置了这些样式:

<style name="AppThemeBase" parent="Theme.MaterialComponents.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="android:windowLightStatusBar">true</item>
    <item name="android:statusBarColor">@color/status_bar</item>

    <item name="colorControlNormal">@color/colorPrimary</item>
    <item name="preferenceTheme">@style/AppThemeBase.RecordingPreferencesTheme</item>
</style>

<style name="AppThemeBase.RecordingPreferencesTheme" parent="@style/PreferenceThemeOverlay">
    <item name="android:textColorPrimary">#FD0000</item>
    <item name="android:textColorSecondary">#1F6F2B</item>
</style>

有了这个选项,我可以在 Android Studio 布局预览中看到我想要实现的效果,但是当我执行它时它没有效果

我执行时的结果:

目前唯一有效的方法是使用 <item name="android:textColor">#FD0000</item> 来更改标题颜色,但我找不到更改摘要颜色的方法。

我的另一个问题是,是否有办法只为该首选项片段设置主题,而不是在所有首选项片段中使用它。在片段布局的根部使用 android:theme 对我不起作用:(

更新:

根据@Susan 的问题,这就是我尝试在片段布局的根部使用 android:theme 的方式我已经根据主主题创建了这个主题

<style name="RecordingPreferenceTheme" parent="AppThemeBase">
    <item name="preferenceTheme">@style/AppThemeBase.RecordingPreferencesTheme</item>
</style>

这是首选项布局,我有一个片段可以膨胀 PreferenceFragmentCompat

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:theme="@style/RecordingPreferenceTheme">

<include
    android:id="@+id/include"
    layout="@layout/toolbar"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<fragment
    android:id="@+id/fragment_container_settings"
    android:name="com.example.app.RecordSettingsFragment$RecordPreferences"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/include" />

</androidx.constraintlayout.widget.ConstraintLayout>

我将在布局的根部设置 android:theme="@style/RecordingPreferenceTheme" 但它不起作用,只需更改 Activity 中设置的主题就会有一些效果。我已经尝试过 ,结果相同。

干杯!!

查看为您的特定案例创建的示例项目 here 此解决方案的唯一问题是您必须从代码创建您的偏好不能使用 xml 文件来膨胀和 对于那些只想要这个解决方案的要点的人来说,使用 setLayoutResource() 方法来设置布局并使用自定义布局我只是根据@Bhuntupana 需要复制了原始布局和硬编码颜色

val messagesCategory = PreferenceCategory(context).apply {
                layoutResource = R.layout.sample_preference
                key = "messages_category"
                title = getString(R.string.messages_header)
                screen.addPreference(this)
            }

更新

使用布局标签来指定要使用的布局资源,就像这样

        <EditTextPreference
            android:layout="@layout/sample_preference"
            app:key="signature"
            app:title="@string/signature_title"
            app:useSimpleSummaryProvider="true" />

sample_preference.xml 只是默认布局的副本 preference_material.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:background="?android:attr/selectableItemBackground"
    android:baselineAligned="false"
    android:clipToPadding="false"
    android:gravity="center_vertical"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight">

    <include layout="@layout/image_frame" />

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="16dp"
        android:paddingBottom="16dp">

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceListItem"
            android:textColor="#FD0000" />

        <TextView
            android:id="@android:id/summary"
            style="@style/PreferenceSummaryTextStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:layout_alignLeft="@android:id/title"
            android:layout_gravity="start"
            android:maxLines="10"
            android:textAlignment="viewStart"
            android:textColor="#1F6F2B" />

    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout
        android:id="@android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="end|center_vertical"
        android:orientation="vertical"
        android:paddingStart="16dp"
        android:paddingLeft="16dp"
        android:paddingEnd="0dp"
        android:paddingRight="0dp" />

</LinearLayout>