以编程方式更改按钮背景可绘制onClick

时间:2015-03-29 14:07:01

标签: android button background toggle drawable

我正在尝试切换按钮的背景绘图,以便当用户单击按钮时,其背景会发生变化,当用户再次单击该按钮时,其背景将返回默认值。这是我的代码:

public void Favorites(View V) {
  Button star = (Button) findViewById(R.id.buttonStar);
  if(star.getBackground().equals(R.drawable.btn_star_off)) {
    star.setBackgroundResource(R.drawable.btn_star_on);
  } else {               
    star.setBackgroundResource(R.drawable.btn_star_off);
  }
}

我很确定这不是你如何使用带有if语句的drawable。有人可以建议一种方法吗?

6 个答案:

答案 0 :(得分:12)

private boolean isButtonClicked = false; // You should add a boolean flag to record the button on/off state

protected void onCreate(Bundle savedInstanceState) {
    ......
    Button star = (Button) findViewById(R.id.buttonStar);
    star.setOnClickListener(new OnClickListener() { // Then you should add add click listener for your button.
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.buttonStar) {
                isButtonClicked = !isButtonClicked; // toggle the boolean flag
                v.setBackgroundResource(isButtonClicked ? R.drawable.btn_star_on : R.drawable.btn_star_off);
            }
        }
    });
}

答案 1 :(得分:6)

您可以在drawable文件夹中创建一个xml。 这个xml(您选择名称......让我们称之为" bg_button_star.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/btn_star_on" />
<item android:drawable="@drawable/btn_star_off" />

然后,您必须将此可绘制文件分配给布局文件中的Button背景属性。

android:background="@drawable/bg_button_star"

如果您想以编程方式执行此操作,则只需执行以下操作:

button.setBackgroundResource(R.drawable.bg_button_star);

当用户第一次点击按钮时,您将Selected状态设置为&#39; true&#39;。背景会相应变化。 (反之亦然&#39;选择状态)。

答案 2 :(得分:2)

您可以在onClick()中执行以下操作:

if(star.getTag()==R.drawable.btn_star_on){
    star.setTag(R.drawable.btn_star_off);
    star.setBackgroundResource(R.drawable.btn_star_off);
} else {
    star.setTag(R.drawable.btn_star_on);
    star.setBackgroundResource(R.drawable.btn_star_on);
}

显然,基于你的信息,if和else语句之前的标签更好。我不知道您的其余代码以及如何检查此按钮是否必须与可绘制资源btn_star_offbtn_star_on

一起使用

答案 3 :(得分:1)

你可以试试这个。

public void Favorites(View V) {
Button star = (Button) findViewById(R.id.buttonStar);

if(star.getBackground().getConstantState().equals(getResources().getDrawable(R.drawable.btn_star_off).getConstantState())) 
    {
            star.setBackground(R.drawable.btn_star_on);
    } else {               
            star.setBackground(R.drawable.btn_star_off);
  }
}

但请确保在开始按钮的onClick()上调用此方法。

另外,你必须做这样的事情。

Button star = (Button) findViewById(R.id.buttonStar);
star.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

      if(v.getBackground().getConstantState().equals(getResources().getDrawable(R.drawable.btn_star_off).getConstantState())) 
       {
            v.setBackground(R.drawable.btn_star_on);
       } else {               
            v.setBackground(R.drawable.btn_star_off);
       }
        }
    });

答案 4 :(得分:0)

答案 5 :(得分:0)

在这种情况下,您应该使用ToggleButton而不是使用Button。

有一个API指南: http://developer.android.com/guide/topics/ui/controls/togglebutton.html