如何设置不同状态的图像按钮背景图像?


80

我希望imagebutton具有两种状态:i)正常ii)触摸(或单击)。

我已经在imagebutton背景中设置了正常图像,并且试图通过onclick方法更改image(已按下),但是它没有改变。

我希望如果我按下图像按钮,那么图像应该从正常变为按下,直到我按下其他按钮,但是不会发生

谁能建议我如何使用选择器或在运行时执行此操作

这是我的imagebuttonpanel代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:gravity="bottom"
  android:id="@+id/buttonpanel">
  <ImageButton android:id="@+id/buttonhome"
               android:layout_width="80dp"
               android:layout_height="36dp"
               android:focusable="true" 
               android:background="@drawable/homeselector">
               </ImageButton>
  <ImageButton android:id="@+id/buttonsearch"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/searchselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonreg"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/registerselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonlogin"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/loginselector"
               android:focusable="true">
               </ImageButton>
</LinearLayout>

而我的选择器xml是

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<item android:state_pressed="true" android:drawable="@drawable/homehover" 
        /> <item android:state_focused="true" android:drawable="@drawable/homehover" 
        /> <item android:drawable="@drawable/home" /> <item android:state_window_focused="true" 
        android:drawable="@drawable/homehover" /> -->
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_pressed="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

而且我也尝试过在ontouch和onclick事件上更改图像资源,但这无济于事。


我认为你正在寻找的东西像这样。我之前也问过类似的问题。
2011年

Answers:


224

在您的drawable中创建一个xml文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@drawable/btn_sendemail_disable" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_send_email_click" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail_roll" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail" />
</selector>

并据此设置图像,然后将此xml设置为您的的背景imageButton


11
正确。这将称为选择器XML
Aman Alam

4
@Hitendra:我想操作人员已经知道这一点。这个问题可以解释为为什么没有调用选择器。
塞缪尔

是否需要state_enabled?
Dr.jacky 2014年

4
这是正常的Button,但不是ImageButton。这也适用于ImageButtonandroid:src属性,但不适用于android:background。您的选择器和OP的选择器有什么区别(格式和可绘制对象的名称除外)?我想念什么吗?
亚历山大·马拉霍夫

@AlexanderMalakhov对我来说,它对于ImageButton和android:background效果很好。
Trilarion'1

15

试试这个

btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        btn.setBackgroundResource(R.drawable.icon);
    }
});

有没有一个我可以做到的想法
Hitendra 2011年

9

嗯 我得到了另一个对我有帮助的解决方案,因为我只有两个不同的状态:

  • 该项目未单击
  • 或单击它,使其突出显示

在我的.xml中,我像这样定义ImageButton:

 <ImageButton
    android:id="@+id/imageButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/selector" />

相应的选择器文件如下所示:

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

    <item android:drawable="@drawable/ico_100_checked" android:state_selected="true"/>
    <item android:drawable="@drawable/ico_100_unchecked"/>

</selector>

然后在我的onCreate中调用:

final ImageButton ib = (ImageButton) value.findViewById(R.id.imageButton);

    OnClickListener ocl =new OnClickListener() {
        @Override
        public void onClick(View button) {
            if (button.isSelected()){
                button.setSelected(false);
            } else {
                ib.setSelected(false);
                //put all the other buttons you might want to disable here...
                button.setSelected(true);
            }
        }
    };

ib.setOnClickListener(ocl);
//add ocl to all the other buttons

完成。希望这可以帮助。花了我一段时间才弄清楚。


8

嗨,尝试以下代码,它将对您有用,

((ImageView)findViewById(R.id.ImageViewButton)).setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_over);

        if(event.getAction() == MotionEvent.ACTION_UP)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_normal);

        return false;
    }
});

1
实际上,如果action_up发生在不同的视图上,那么这实际上也不起作用。尝试使用event.getAction()== MotionEvent.ACTION_CANCEL而不是ACTION_UP。
chug2k 2012年

3

我认为您的问题不是选择器文件。

你必须添加

<imagebutton ..
    android:clickable="true"
/>

到您的图像按钮。

默认情况下,onClick是在列表项级别(父)处理的。并且imageButtons不接收onClick。

当您添加以上属性时,图像按钮将接收事件并使用选择器。

检查此POST,该复选框的说明也是如此。


1

如果要按下图像按钮,则图像应从普通更改为按下

但是我最好的方法是自定义RadioButton并在一个组中使用它们。我看到了一个例子。 抱歉,我不记得那个链接。

但是如果您想避免这种情况。您需要将此添加到您的selector.xml

一旦完成。刚到您的代码并添加此

public void onClick ( View v ) {
    myImageButton.setSelected ( true ) ;
 }

您将看到结果。但是您必须管理最近按下哪个按钮的状态。这样你就可以设置

  myOLDImageButton.setSelected ( false ) ;

我建议您将所有按钮引用放在一个数组中。



0

你试过了CompoundButton吗?CompoundButton具有与您的需求完全匹配的checkable属性。用这些替换ImageButton。

  <CompoundButton android:id="@+id/buttonhome"
                  android:layout_width="80dp"
                  android:layout_height="36dp"
                  android:background="@drawable/homeselector"/>

将选择器xml更改为以下内容。可能需要进行一些修改,但一定要使用state_checked代替state_pressed

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_checked="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

CompoundButton.OnCheckedChangeListener您需要检查和取消选择其他根据您的情况。

 mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

   public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // Uncheck others. 
        }
   }
});

同样,OnCheckedChangeListener为每个按钮设置a ,选中该按钮将取消选中其他按钮。希望这可以帮助。


您不能在XML中直接使用CompoundButton,因为它是抽象类。
Dan Hulme


0

您可以在res / drawable中创建选择器文件

示例:res / drawable / selector_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/btn_enabled" />
</selector>

以及布局活动,片段等

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_bg_rectangle_black"/>
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.