【问题标题】:How to change text color and background color of PreferenceScreen in Android如何在Android中更改PreferenceScreen的文本颜色和背景颜色
【发布时间】:2020-07-19 22:25:11
【问题描述】:

如何更改由 PreferenceFragmentCompat 膨胀的 PreferenceScreen 中的文本和背景颜色?

尝试过How to change the text color of PreferenceCategory/PreferenceScreen,但该解决方案适用于 Preference Activity 而不是 PreferenceFragmentCompat。

还尝试按照How to change text color of preference category in Android? 在首选项屏幕中使用布局标签,但不保存首选项。

class FragmentSettings: PreferenceFragmentCompat() {

    private lateinit var viewModel: SharedViewModel

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        addPreferencesFromResource(R.xml.root_preferences)

        val application = requireNotNull(this.activity).application
        val dataBase = DataBase.getInstance(application)
        val repo = Repo(dataBase!!)

        viewModel = ViewModelProvider(this,
            SharedViewModelFactory(
                dataBase
            )
        ).get(SharedViewModel::class.java)

        (activity as MainActivity).supportActionBar?.title = "Settings"
}
            

这是我的 settingsPreference.xml 中的代码。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/colorExtra"
    android:backgroundTint="@color/colorExtra">

    <PreferenceCategory android:layout="@layout/pref_title" app:title="@string/location_header">

        <SwitchPreferenceCompat
            android:background="@color/colorExtra"
            android:backgroundTint="@color/colorExtra"
            app:defaultValue="true"
            android:layout= "@layout/switch_pref_item"
            app:disableDependentsState="true"
            app:key="USE_DEVICE_LOCATION"
            app:summary="Allow the app to get your location"
            app:title="@string/your_location_title" />

        <EditTextPreference
            android:background="@color/colorExtra"
            android:backgroundTint="@color/colorExtra"
            app:dependency="USE_DEVICE_LOCATION"
            app:key="setLocation"
            android:layout="@layout/set_location_pref"
            app:title="@string/set_location_title"
            app:useSimpleSummaryProvider="true" />


    </PreferenceCategory>

</PreferenceScreen>

【问题讨论】:

    标签: android kotlin android-fragments preferencescreen


    【解决方案1】:

    这应该通过样式来完成,并遵循用于设置任何布局样式的相同过程。它不是通过首选项 xml 完成的。

    创建一个作为Theme.AppCompat 子级的xml 样式。然后您可以覆盖android:windowBackgroundandroid:textColor 的颜色。您可以将此样式应用于清单中的活动。

    例如在styles.xml:

    <color name="preferencesTextColor">$ff0000</color>
    <color name="preferencesBackgroundColor">#202020</color>
    
    <style name="MyPreferencesTheme" parent="Theme.AppCompat">
        <item name="android:textColor">@color/preferencesTextColor</item>
        <item name="android:windowBackground">@color/preferencesBackgroundColor</item>
    </style>
    

    然后在清单中,将主题应用到活动:

    <activity android:name="MyPreferencesActivity"
        android:theme="@style/MyPreferencesTheme"
        android:label="@string/myPreferenceActivityLabel" />
    

    【讨论】:

    • 如果你把它放在 MainActivity 中它会在 PreferenceFragmentCompat 中工作吗?这是否也意味着它会影响其他片段和布局,例如。如果我在活动主题中将文本颜色设置为蓝色,那么在其他布局中文本颜色会是蓝色吗?
    • 如果您想根据用户偏好设置主题,可以使用这种方法吗?例如,您可以根据用户将主题设置为亮模式为亮,夜间模式为暗吗?
    • 主题适用于整个活动。如果您想将其应用于特定的偏好片段,我不知道他们是否提供了一种干净的方法来做到这一点。对于典型的视图和片段,您可以在布局 xml 中的布局元素中添加样式,但 PreferenceFragmentCompat 不会进入 xml 布局。我总是在它自己的 Activity 中托管它。
    • 首选项库中的许多功能依赖于实现某些接口的 Activity,因此我认为他们没有将其设计为与单 Activity 架构一起工作。因此,我最终对除设置屏幕之外的所有内容都使用了一项活动,然后仅针对设置使用一项活动。
    • 您可以从Theme.AppCompat.DayNight 继承来创建一个响应用户暗模式设置的主题。
    猜你喜欢
    • 2018-12-25
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多