主题偏好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>
我在将主题设置为 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>