Android:使用XML为切换按钮指定两个不同的图像


100

我正在尝试覆盖默认ToggleButton外观。这是定义的XML ToggleButton

<ToggleButton android:id="@+id/FollowAndCenterButton"
        android:layout_width="30px"
        android:layout_height="30px"
        android:textOn="" android:textOff="" android:layout_alignParentLeft="true"
        android:layout_marginLeft="5px"
        android:layout_marginTop="5px" android:background="@drawable/locate_me"/>

现在,我们有两个要用于单击/未单击状态的30 x 30图标。现在,我们有一些代码,可以根据状态以编程方式更改背景图标:

centeredOnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (centeredOnLocation.isChecked()) {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me_on));
            } else {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me));
            }
        }
});

显然,我正在寻找一种更好的方法来做到这一点。我试图为背景图片创建一个选择器,该选择器将在状态之间自动切换:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/locate_me" /> <!-- default -->
 <item android:state_checked="true"
       android:drawable="@drawable/locate_me_on" /> <!-- pressed -->
 <item android:state_checked="false"
       android:drawable="@drawable/locate_me" /> <!-- unchecked -->

但这是行不通的。阅读ToggleButtonAPI(http://developer.android.com/reference/android/widget/ToggleButton.html),看来唯一继承的xml属性是

    XML Attributes
Attribute Name  Related Method  Description
android:disabledAlpha       The alpha to apply to the indicator when disabled. 
android:textOff         The text for the button when it is not checked. 
android:textOn      The text for the button when it is checked. 

尽管类具有方法isChecked()和,但似乎没有android:state_checked属性。setChecked()

因此,有没有办法在XML中做我想做的事情,还是我陷入混乱的解决方法中?


请注意,如果您不使用文字,我认为使用可能会更好CompoundButton
Timmmm 2012年

1
不用理that CompoundButton是抽象的!
Timmmm 2012年

Answers:


159

您的代码很好。但是,切换按钮将在选择器中显示与之匹配的第一项,因此默认项应排在最后。以下列方式安排项目,以确保将它们全部利用:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" /> //currently pressed turning the toggle on
    <item android:state_pressed="true" /> //currently pressed turning the toggle off
    <item android:state_checked="true" /> //not pressed default checked state
    <item /> //default non-pressed non-checked
</selector>

3
这是完全合理的;我从未在选择器和switch语句之间建立连接。
I82'09年

您辛苦了...我在按钮,复选框方面遇到了问题,然后还尝试了单选按钮,最后这篇帖子很有帮助。非常感谢Vitaly Polonetsky和I82Much
David Prun 2010年

8
某个地方的文档说它从顶部开始读取,停在所有条件都满足的第一个状态,因此,如果default位于顶部,它将永远不会超过该可绘制对象。
特拉维斯

1
@ I82Much switch总是会选择“正确的一个”而不管顺序如何,这if-elseif-elseif-else在条件类似的情况下表现得更像冗长的state_x == true && state_y == false && state_z = true
TWiStErRob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.