1

我想要具有两种状态的按钮:

  1. 离开
  2. 开(或单击)。

我已经在按钮背景中设置了普通图像,我正在尝试从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;
    }

}
});
4

6 回答 6

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.onand flag=0;。下一条指令将if (flag == 0)是正确的,然后您再次输入button1.setBackgroundResource(R.drawable.off);

于 2013-07-18T07:14:52.977 回答
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/drawable/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_ondrawable/icon_alarm_offToggleButton.setChecked()

于 2013-07-18T07:27:53.773 回答
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 并将其存储在可绘制文件夹中。将 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>
于 2013-07-18T07:19:00.583 回答
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;
    }
}
});
于 2013-07-18T07:17:28.227 回答
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;
    }

}
});
于 2013-07-18T07:23:12.573 回答
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;
}
}
于 2013-07-18T08:09:05.853 回答