我需要在SwitchPreference项目中为开关控件设置样式(包括拇指和轨迹)。我想使用样式和主题以声明方式进行操作,而不使用未记录的功能或代码中的显式调用。我使用XML定义了首选项,并使用AndroidX的PreferenceFragmentCompat对其进行管理。
到目前为止,我尝试用android:thumb创建新样式并定义了track属性(均通过XML形状)。当我在应用程序主题的switchStyle中设置此样式时,该样式无效。当我将switchStyle移到PreferenceThemeOverlay的后代时,它没有任何作用。我还尝试定义android:thumb并在我的应用程序主题中进行跟踪,但是它也不起作用(无论如何我都觉得很有趣,但是无论如何)。
仅在我在应用程序主题中定义switchStyle并在SwitchPreferenceStyle中设置android:widgetLayout(从首选项覆盖主题中的switchPreferenceStyle引用)后,它指向preference_widget_switch布局的副本(实际上,我发现它足以用新的布局覆盖preference_widget_switch名称,但这只是另一种技巧)。
但是后来发现布局中定义的@ + id / switch_widget是一个新ID,因此我将其更改为@android:id / switch_widget。然后,一切正常进行,除了Android Studio指出@android:id / switch_widget直到API级别24才可用。这很有趣,因为我使用Lollypop作为测试电话,并且在那里一切正常。
在应用主题中:
<item name="preferenceTheme">@style/PreferenceThemeOverlay.Mine</item>
<item name="switchStyle">@style/SwitchStyle</item>
首选项覆盖主题:
<style name="PreferenceThemeOverlay.Mine">
<item name="switchStyle">@style/SwitchStyle</item>
<item name="switchPreferenceStyle">@style/SwitchPreferenceStyle</item>
</style>
样式:
<style name="SwitchStyle" parent="Widget.AppCompat.CompoundButton.Switch">
<item name="android:thumb">@drawable/switch_thumb</item>
<item name="track">@drawable/switch_track</item>
</style>
<style name="SwitchPreferenceStyle" parent="Preference.SwitchPreference.Material">
<item name="android:widgetLayout">@layout/my_preference_widget_switch</item>
</style>
布局:
<androidx.appcompat.widget.SwitchCompat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@android:id/switch_widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false"
android:background="@null"
/>
最后,我设法在可绘制对象显示的首选项中进行了切换。但是我以一种相当肮脏的方式做到了这一点,我仍然想知道它是否可以在早期平台上运行。
因此,我想知道是否有一种方法可以通过设置一些属性而不是从AndroidX调整布局来更简单地通过样式设置样式,更不用说它具有switch_widget API级别依赖性了。..