简体   繁体   English

androidx 中的自定义 SwitchPreferenceCompat

[英]Custom SwitchPreferenceCompat in androidx

I'm trying to change default switch thumb in preference screen to my custom.我正在尝试将首选项屏幕中的默认开关拇指更改为我的自定义。 I've tried different solutions found here but none of them working.我尝试了在这里找到的不同解决方案,但没有一个有效。 My last try was to create a custom layout but the problem is that I can't properly add switch to that layout.我最后一次尝试是创建自定义布局,但问题是我无法正确地将开关添加到该布局。 Can't really add androidx.appcompat.widget.SwitchCompat because of the id (@android:id/switch_widget requires API level 24 (current min is 21) or with other suggested id: Cannot resolve symbol '@android:id/switchWidget').由于 id 无法真正添加 androidx.appcompat.widget.SwitchCompat(@android:id/switch_widget 需要 API 级别 24(当前最小值为 21)或其他建议的 id:无法解析符号 '@android:id/switchWidget' )。 root_preferences.xml (part): root_preferences.xml(部分):

<PreferenceCategory app:title="@string/confidentiality"
    android:layout="@layout/preferences_category">

    <SwitchPreferenceCompat
        android:layout="@layout/switch_preference_compat"
        app:key="show_contacts"
        app:title="@string/contact_information"
        app:singleLineTitle="false"
        app:defaultValue="true"
        app:iconSpaceReserved="false"/>
</PreferenceCategory>

switch_preference_compat.xml: switch_preference_compat.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:orientation="vertical">

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/ks_font_data"
            android:textSize="18sp"/>

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"/>

    </LinearLayout>

    <androidx.appcompat.widget.SwitchCompat
        android:id="@android:id/switchWidget" <--- error here
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

I tried styles but it also didn't work well.我试过 styles 但它也不能正常工作。 I want my thumb looks like this[my custom switch][1] [1]: https://i.stack.imgur.com/Js5vb.png我希望我的拇指看起来像这样[我的自定义开关][1] [1]:https://i.stack.imgur.com/Js5vb.png

So after a few hours I was able to find out how to do that.因此,几个小时后,我能够找到如何做到这一点。 Posting this answer so it may help somebody save their time.发布此答案,以便它可以帮助某人节省时间。 In root_preferences.xml there is android:widgetLayout property where you can set custom layout for SwitchPreferenceCompat:在 root_preferences.xml 中有android:widgetLayout属性,您可以在其中为 SwitchPreferenceCompat 设置自定义布局:

    <SwitchPreferenceCompat
        android:widgetLayout="@layout/switch_preference_compat"
        app:key="show_contacts"
        app:title="@string/contact_information"
        app:singleLineTitle="false"
        app:defaultValue="true"
        app:iconSpaceReserved="false"/>

switch_preference_compat.xml: switch_preference_compat.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:orientation="vertical">

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"/>

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"/>

    </LinearLayout>

    <androidx.appcompat.widget.SwitchCompat
        android:id="@+id/switchWidget"
        android:thumb="@drawable/thumb"
        app:track="@drawable/track"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout> 

there is where you put your drawables for custom thumb and track.您可以在其中放置用于自定义拇指和轨道的可绘制对象。 Mine looks so: thumb.xml:我的看起来是这样的:thumb.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="false"
        android:drawable="@drawable/switch_icon_false" />

    <item android:state_checked="true"
        android:drawable="@drawable/switch_icon_true"/>

</selector>

track.xml:轨道.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="false">
        <shape android:shape="rectangle">
            <solid android:color="#dedede"/>
            <corners android:radius="100sp"/>
            <stroke android:color="#dedede"
                android:width="1dp"/>
        </shape>
    </item>

    <item android:state_checked="true">
        <shape android:shape="rectangle">
            <solid android:color="#9dcbb5"/>
            <corners android:radius="100sp"/>
        </shape>
    </item>

</selector>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM