android 如何编程使用PreferenceFragmentCompat中的材料3开关?

jhdbpxl9  于 2022-12-31  发布在  Android
关注(0)|答案(1)|浏览(155)

SwitchPreferenceCompat仍然保留旧的Switch样式,我知道可以按以下方式设置Material 3的样式:
theme.xml

<style name="Theme.Material3.Preference" parent="Theme.Material3.DayNight.NoActionBar">
    <item name="preferenceTheme">@style/MaterialPreferenceThemeOverlay</item>
</style>

<style name="MaterialPreferenceThemeOverlay" parent="PreferenceThemeOverlay">
    <item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item>
</style>

<style name="Preference.SwitchPreferenceCompat" parent="Preference.SwitchPreferenceCompat.Material">
    <item name="android:widgetLayout">@layout/preference_widget_material_switch</item>
</style>

preference_widget_material_switch.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.materialswitch.MaterialSwitch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/switchWidget"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="false"
    android:background="@null"/>

setting.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreferenceCompat
        android:defaultValue="true"
        android:key="pref_key"
        android:summary="Preference Summary"
        android:title="Preference Title" />
</PreferenceScreen>

但出于某种原因,我必须以编程方式构建PreferenceFragment,如下所示:

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    val context = preferenceManager.context
    val screen = preferenceManager.createPreferenceScreen(context)
    val notificationPreference = SwitchPreferenceCompat(context).apply {
        key = "pref_key"
        title = "Preference Title"
        summary="Preference Summary"
    }
    screen.addPreference(notificationPreference)
    preferenceScreen = screen
}

此时,即使我有上面的ThemeOverlay,开关的样式仍然是旧的。

那么,如何以编程方式使用PreferenceFragmentCompat中的材料3开关?

  • 我猜可能可以通过SwitchPreferenceCompat的一个构造函数来设置它的主题,但我不知道视图,所以你们能帮我吗?*
SwitchPreferenceCompat(@NonNull Context context)  

SwitchPreferenceCompat(
    @NonNull Context context,
    @Nullable AttributeSet attrs
)  

SwitchPreferenceCompat(
    @NonNull Context context,
    @Nullable AttributeSet attrs,
    int defStyleAttr
)  

SwitchPreferenceCompat(
    @NonNull Context context,
    @Nullable AttributeSet attrs,
    int defStyleAttr,
    int defStyleRes
)
nr9pn0ug

nr9pn0ug1#

我找到的解决方案是创建一个扩展SwitchPreference的自定义视图,并在其init块调用setWidgetLayout()中传递preference_widget_material_switch.xml布局的resId

class MaterialSwitchPreference(context: Context): SwitchPreferenceCompat(context) {

    init {
        widgetLayoutResource = R.layout.preference_widget_material_switch
    }

}

那么就用这个MaterialSwitchPreference代替通常的SwitchPrefernce
注1:如果您不创建自定义视图,而只是在SwitchPreference示例上使用setWidgetLayout(),则它将无法正常工作,您将拥有新的Switch视图,但它不会响应首选项更改。
注2:我是一个初学者,我不知道为这样一个小东西扩展视图是否是一个好的实践,但它对我来说工作得很好...

相关问题