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

时间:2011-01-21 06:02:22

标签: android android-layout

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

我在 imagebutton 背景中设置了普通图片,我正在尝试更改 图片(已按下)来自 onclick 方法,但它没有改变。

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

有人可以向我建议如何使用选择器或在运行时执行此操作?

这是我的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事件上更改图像资源,但它没有帮助。

10 个答案:

答案 0 :(得分:221)

在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的背景。

答案 1 :(得分:15)

试试这个

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

答案 2 :(得分: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;
    }
});

答案 3 :(得分:8)

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

  • 未点击该项目
  • 或点击它,因此会突出显示

在我的.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

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

答案 4 :(得分:3)

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

你必须添加

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

到您的图片按钮。

默认情况下, onClick在listitem级别处理(父级)。并且imageButtons没有收到onClick。

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

选中此POST,其中解释了相同的复选框。

答案 5 :(得分:1)

如果你想要按下图像按钮,那么图像应该从正常变为按下

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

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

一旦完成。刚到你的代码并添加这个

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

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

  myOLDImageButton.setSelected ( false ) ;

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

答案 6 :(得分:0)

您要做的更多是分段按钮而不是图像按钮列表。

此处http://blog.bookworm.at/2010/10/segmented-controls-in-android.html是如何执行此操作的示例。基本的想法是自定义RadioButton而不是ImageButton,因为RadioButton将具有您需要的已检查状态

答案 7 :(得分:0)

你试过CompoundButton吗? CompoundButton具有完全符合您需求的可检查属性。用这些替换ImageButtons。

  <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,在选中时将取消选中其他按钮。希望这有助于。

答案 8 :(得分:0)

@ ingsaurabh的回答是如果你使用onClick甚至是要走的路。但是,如果您使用的是onTouch事件,则可以使用view.setPressed()选择不同的背景(仍然与@ ingsaurabh的示例相同)。

有关详细信息,请参阅以下内容:"Press and hold" button on Android needs to change states (custom XML selector) using onTouchListener

答案 9 :(得分:0)

您可以在res / drawable

中创建选择器文件

例如: RES /抽拉/ 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"/>