ImageButton的选中状态

4
我有一个如下的图像按钮。
<ImageButton
        android:id="@+id/imagebutton"
        android:layout_width="250dp"
        android:layout_height="100dp" 

        android:background="@drawable/perm_group_calendar"/>

perm_group_calendar.xml

<?xml version="1.0" encoding="utf-8"?>

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


    <item android:state_selected="true" android:drawable="@drawable/perm_group_calendar_selected" />
    <item android:drawable="@drawable/perm_group_calendar_normal" />    
</selector>

选择状态本身不起作用。我从这个SO找到了答案:

如何使用带有选定状态的Android ImageButton?

我使用了下面的代码,现在它可以工作了。

 imageButton.setOnClickListener(new OnClickListener() {

           public void onClick(View button) {
               if (button.isSelected()){
                   button.setSelected(false); 
                   //...Handle toggle off
               } else {
                   button.setSelected(true);
                   //...Handled toggle on
               }
           }

       }); 

为什么我们需要切换选定状态?

你需要使用一个带有checked属性的ToggleButton来实现这个功能。 - nhaarman
imageButton.setImageDrawable(getContext().getResources().getDrawable(R.drawable.perm_group_calendar)); 尝试一下。 - Triode
@RajeshCP 即使我在代码中使用setImageDrawable,我仍然需要使用oncliklistener手动设置选定状态,才能使其正常工作。 - saravanan
是的,你可以像这样设置可绘制对象,其他部分保持不变。在你的点击监听器中,使用 button.setSelected(!button.isSelected())。 - Triode
3个回答

2
我认为你应该在drawable XML文件中进行以下操作:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@drawable/aaaa" />
    <item android:state_pressed="true" android:drawable="@drawable/aaaa"></item>
    <item android:drawable="@drawable/ic_launcher" />    
</selector>

你的ImageButton应该像下面这样:

<ImageButton
        android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#123456"
        android:padding="10dp"
        android:scaleType="fitXY"
        android:src="@drawable/drawableFile" />

你需要添加android:state_pressed="true",这样就可以处理按下状态了。

如RomianGuy在答案中提到的:

当使用键盘/DPAD/轨迹球等选择项目时,会使用state_selected,因此我认为这就是为什么你必须切换状态的原因。

希望这能帮到你。


它不起作用。按下状态是有效的。选中状态无效。 - saravanan

2
因为ImageButton不会自动显示所选状态,它通常(与人工相反)只显示正常和按下状态(对于聚焦状态不确定,但应该是这样)。你可以使用自定义的ToggleButton(或Switch或CheckBox)来解决问题。总之,对我来说,你的解决方案看起来并不那么糟糕。

是的。我能理解,所以选定状态不会自动工作。我们应该自己来做。这是安卓开发团队的设计问题吗? - saravanan
我不会称之为问题,这是设计上的考虑。很好我们可以轻松地克服这样的“限制”... ;) - Phantômaxx

0

仅供参考。如果您想要为ImageButton更改图标和颜色,您需要为'android:src'和'android:background'分别编写两个选择器:

<ImageButton
            android:id="@+id/ibToFavorites"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_gravity="center_vertical"
            android:background="@null"
            android:src="@drawable/selector_checkin_to_favourite"
            android:tint="@color/selector_checkin_to_favourite"
            android:layout_marginEnd="15dp" />

res/drawable/selector_checkin_to_favourite.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected = "true"
        android:drawable="@drawable/ic_star_black_45dp"/>
    <item
        android:drawable="@drawable/ic_star_border_black_45dp"/>
</selector>

res/color/selector_checkin_to_favourite.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected = "true"
        android:color="@color/colorAccent"/>
    <item
        android:color="@color/colorSecondary"/>
</selector>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接