Android switch定制左右可拉式

Android switch定制左右可拉式,android,android-switch,Android,Android Switch,我正在尝试创建如下自定义开关: <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <stroke android:width="1dp" android:color="@color/text_input"/> <corners

我正在尝试创建如下自定义开关:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >

        <stroke 
            android:width="1dp" 
            android:color="@color/text_input"/>

        <corners
            android:radius="1dp"
            android:bottomLeftRadius="4.5dp"
            android:bottomRightRadius="4.5dp"
            android:topLeftRadius="4.5dp"
            android:topRightRadius="4.5dp" >
    </corners>
</shape>

我觉得我需要的是一个左/右可绘制的东西,每一个都处于绿色/白色状态,或者是一个绿色的轮廓和一个可绘制的东西,以便选择

我不明白的是,在类似这样的帖子中,所有提供的示例Drawable都向右倾斜,而“on”按钮向左倾斜

我试着用下面的“拇指”来画

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true"  android:drawable="@drawable/choice_right"/>
    <item                               android:drawable="@drawable/choice_left"/>
</selector>

但它似乎切断了抽屉的末端。如果我还将轨迹设置为如下所示:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >

        <stroke 
            android:width="1dp" 
            android:color="@color/text_input"/>

        <corners
            android:radius="1dp"
            android:bottomLeftRadius="4.5dp"
            android:bottomRightRadius="4.5dp"
            android:topLeftRadius="4.5dp"
            android:topRightRadius="4.5dp" >
    </corners>
</shape>


然后我得到的只是一条细线。因此,我不确定下一步要尝试什么。

这不能仅用样式,这需要自定义视图实现。这是很多代码,所以我建议您使用第三方库,如
此库经过尝试和测试,因此使用它而不是重写它是安全的。

更新答案

为此,应在drawable文件夹中创建图层列表

res/drawable/toggle_layerlist.xml

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/choice_right">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke 
        android:width="1dp" 
        android:color="@color/text_input"/>

    <corners
        android:radius="1dp"
        android:bottomLeftRadius="4.5dp"
        android:bottomRightRadius="4.5dp"
        android:topLeftRadius="4.5dp"
        android:topRightRadius="4.5dp" >
    </corners>
</shape>
    </item>

    </layer-list>

对其他状态执行相同操作

您可以将RadioGroup与两个RadioButton一起使用:

<RadioGroup
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:orientation="horizontal">

            <RadioButton
                    android:id="@+id/male_radio_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="@drawable/selector_radio_btn_text"
                    android:background="@drawable/selector_radio_btn_left_bg"
                    android:gravity="center"
                    android:button="@null"
                    android:text="@string/male_radio_text"
                    />

            <RadioButton
                    android:id="@+id/female_radio_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="@drawable/selector_radio_btn_text"
                    android:background="@drawable/selector_radio_btn_right_bg"
                    android:gravity="center"
                    android:button="@null"
                    android:text="@string/female_radio_text"/>
        </RadioGroup>

其中选择器_radio_btn_text.xml是文本颜色选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:color="@color/checkbox_text_color_checked"/>
<item android:state_checked="false" android:color="@color/checkbox_text_color"/>


和选择器_radio_btn_left_bg(right bg)。xml是左侧和右侧的背景

我创建了一个示例应用程序,您可以找到它来解决您的问题。您可以查看具有段控制的正确实现的库

基本上,我创建了一个自定义控件,它扩展了
LinearLayout
,默认的
weightSum
为2。添加了两个
按钮
,其中
权重
为1,并应用了一些逻辑在它们之间切换。切换时,将触发在此接口上构建的自定义事件

public interface SwitchToggleListener {
    void onSwitchToggle(SwitchToggleState switchToggleState);
}
我使用
drawable
资源来设置按钮的样式

最终的结果是这样的


与其使用任何外部库或支持库,还不如使用RadioGroup和单选按钮轻松完成。正如“迪米特里”在他的回答中提到的那样,我也用同样的方法实现了这一目标。 这是我给这个问题的答案的复印件


pink_out_line.xml

 <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="#80000000" />
<stroke
    android:width="1dp"
    android:color="@color/pink" />
</shape>

切换_widget_background.xml

      <?xml version="1.0" encoding="UTF-8"         standalone="no"?>
      <selector        xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:drawable="@color/pink" android:state_checked="true" />
     <item android:drawable="@color/dark_pink" android:state_pressed="true" />
     <item android:drawable="@color/transparent" />
    </selector>


因此,也许答案是,这不是一个特别面向Android的设计,设计需要更改以更适合Android的UI元素。此设计源自iOS,但新的SwitchCompat小部件看起来与此小部件一样好和简单,所以请尝试一下。
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="#80000000" />
<stroke
    android:width="1dp"
    android:color="@color/pink" />
</shape>
      <?xml version="1.0" encoding="UTF-8"         standalone="no"?>
      <selector        xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:drawable="@color/pink" android:state_checked="true" />
     <item android:drawable="@color/dark_pink" android:state_pressed="true" />
     <item android:drawable="@color/transparent" />
    </selector>