我正在尝试创建一个这样的自定义开关:
我觉得我需要的是左/右抽屉,每个都是绿色/白色状态,或者是一个带有抽屉的绿色轮廓,用于何时选择。
我在this这样的帖子中不明白的是,所有样本drawables都向右倾斜,但“on”按钮偏向左侧。
我正在尝试使用以下'thumb'drawable。
<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>
然后我得到的只是一条细线。所以,我不确定下一步该尝试什么。
答案 0 :(得分:9)
这不能单独使用样式,这需要自定义视图实现。这是很多代码所以我的建议是使用第三方库 https://github.com/hoang8f/android-segmented-control 该库经过试用和测试,因此可以安全地使用它而不是重写它。
答案 1 :(得分:5)
我创建了一个示例应用,您可以找到here来解决您的问题。您可以查看具有正确实现段控件的this库。
基本上我创建了一个自定义控件,扩展LinearLayout
,默认weightSum
为2.两个Buttons
添加weight
为1,并且应用了一些逻辑在他们之间切换。在切换时,会触发构建在此接口上的自定义事件。
public interface SwitchToggleListener {
void onSwitchToggle(SwitchToggleState switchToggleState);
}
我使用drawable
资源来设置按钮的样式。
最终结果看起来像这样
答案 2 :(得分:1)
你可以使用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>
其中selector_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"/>
和selector_radio_btn_left_bg(右边bg).xml是左右两边的backgorund
答案 3 :(得分:1)
使用RadioGroup和单选按钮可以轻松完成,而不是使用任何外部libaray或支持库。作为&#34; Dimitry&#34;他在回答中提到我也用同样的东西来实现。 以下是针对问题How to custom switch button?
给出的答案的复制粘贴 <RadioGroup
android:checkedButton="@+id/offer"
android:id="@+id/toggle"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginBottom="@dimen/margin_medium"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:layout_marginTop="@dimen/margin_medium"
android:background="@drawable/pink_out_line"
android:orientation="horizontal">
<RadioButton
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp"
android:layout_marginLeft="1dp"
android:id="@+id/search"
android:background="@drawable/toggle_widget_background"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:gravity="center"
android:text="Search"
android:textColor="@color/white" />
<RadioButton
android:layout_marginRight="1dp"
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp"
android:id="@+id/offer"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/toggle_widget_background"
android:button="@null"
android:gravity="center"
android:text="Offers"
android:textColor="@color/white" />
</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>
toggle_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>
答案 4 :(得分:0)
更新回答
要执行此操作,您应该在可绘制文件夹中创建图层列表
<强> RES /抽拉/ 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>
将图层列表添加到选择器
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/toggle_layerlist" android:state_checked="true" />
</selector>
使用此选择器作为背景,但请确保在开/关状态下清空文本
by set android:textOff="" android:textOn=""
<ToggleButton
android:id="@+id/chkState"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/toggle_selector"
android:textOff=""
android:textOn=""/>
对其他州做同样的事情