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
)
1条答案
按热度按时间nr9pn0ug1#
我找到的解决方案是创建一个扩展
SwitchPreference
的自定义视图,并在其init块调用setWidgetLayout()
中传递preference_widget_material_switch.xml
布局的resId
。那么就用这个
MaterialSwitchPreference
代替通常的SwitchPrefernce
。注1:如果您不创建自定义视图,而只是在
SwitchPreference
示例上使用setWidgetLayout()
,则它将无法正常工作,您将拥有新的Switch
视图,但它不会响应首选项更改。注2:我是一个初学者,我不知道为这样一个小东西扩展视图是否是一个好的实践,但它对我来说工作得很好...