有没有一种方法可以仅更改样式来更改SwitchPreference开关的拇指和轨迹?

时间:2019-07-19 15:30:59

标签: styles androidx switchpreference

我需要在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级别依赖性了。..

0 个答案:

没有答案