不能为Android按钮设置SetBackground资源图像

时间:2013-07-18 07:11:47

标签: android background-image android-button

我想要两种状态的按钮:

  1. 关闭
  2. 开(或点击)。
  3. 我在按钮背景中设置了正常图像,我正在尝试从onClick方法更改图像(按下),但它没有改变。

    final Button button1 = (Button) findViewById(R.id.button1);
    
    button1.setOnClickListener(new OnClickListener() {
    
    private int flag;
    
    @Override
    public void onClick(View v) {
        if(flag==1)
        {
          button1.setBackgroundResource(R.drawable.on);
              flag=0;
        }
        if(flag==0)
        {
              button1.setBackgroundResource(R.drawable.off);
              flag=1;
        }
    
    }
    });
    

6 个答案:

答案 0 :(得分:4)

  if(flag==1)
    {
      button1.setBackgroundResource(R.drawable.on);
          flag=0;
    }
    else if(flag==0)
    {
          button1.setBackgroundResource(R.drawable.off);
          flag=1;
    }

您需要else if,否则当flag = 1时,您将背景设置为R.drawable.onflag=0;。下一条指令为if (flag == 0),这是真的,您再次放button1.setBackgroundResource(R.drawable.off);

答案 1 :(得分:4)

还有另一种选择:您可以将android.widget.ToggleButton与选择器一起使用:

代码:

ToggleButton toggleButton = (ToggleButton) view.findViewById(R.id.toggleButton);
toggleButton.setChecked(true/false);

使用代码段的主要布局:

....
<ToggleButton android:id="@+id/toggleButton"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textOn=""
              android:textOff=""
              android:background="@drawable/toggle_states"/>
....

RES /抽拉/ toggle_states.xml:     

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/icon_alarm_on"></item>
    <item android:state_checked="false" android:drawable="@drawable/icon_alarm_off"></item>
</selector>

Android将自动设置 drawable / icon_alarm_on drawable / icon_alarm_off ,具体取决于使用ToggleButton.setChecked()方法设置的状态

答案 2 :(得分:3)

您的要求适合ToggleButton,而不仅仅是Button。您可以将按钮更改为切换按钮和setOnCheckedChangedListener()以处理打开和关闭状态。

使用以下代码

<ToggleButton 
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/check"   //check.xml
        android:textOn=""
        android:textOff=""/>

并准备一个可绘制的xml并将其存储在drawable文件夹中。将xml文件命名为check.xml

您的check.xml代码应如下所示。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- When selected, use grey -->
    <item android:drawable="@drawable/your_switched_on_image"
          android:state_checked="true" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawableyour_switched_off_image"
        android:state_checked="false"/>

 </selector>

答案 3 :(得分:2)

您可以尝试使用其他部分

 @Override
public void onClick(View v) {
    if(flag==1)
    {
      button1.setBackgroundResource(R.drawable.on);
          flag=0;
    }
    else 
    {
          button1.setBackgroundResource(R.drawable.off);
          flag=1;
    }
}
});

答案 4 :(得分:2)

以下内容更符合您的需求,但还有其他一些注意事项。

您是否需要记住应用重启/配置更改的状态。如果是这样,您需要使用共享首选项来存储状态并检索它。

我认为,标志变量需要在侦听器外声明,否则每次发生单击事件时都会重置它,并且您将丢失状态。玩弄它。应该让你更近一点:

final Button button1 = (Button) findViewById(R.id.button1);
private int flag = 0;

button1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    if(flag==1)
    {
      button1.setBackgroundResource(R.drawable.on);
           flag=0;
    }else if(flag==0)
    {
          button1.setBackgroundResource(R.drawable.off);
          flag=1;
    }

}
});

答案 5 :(得分:2)

由于您已在函数调用中传递View,因此您可以直接使用view而不是调用button1。这种方式更准确。我在我的应用程序中使用它:

@Override
public void onClick(View v) {
if(flag==1)
{
      v.setBackgroundResource(R.drawable.on);
      flag=0;
}
else 
{
      v.setBackgroundResource(R.drawable.off);
      flag=1;
}
}