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

Programmatically change button background drawable onClick

我正在尝试切换我的按钮的背景可绘制对象,这样当用户单击按钮时,它的背景就会改变,当用户再次单击按钮时,它的背景 returns 变为默认。这是我的代码:

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 语句的可绘制对象的方式。有人可以建议一种方法吗?

不要那样做。请改用选择器资源 http://www.compiletimeerror.com/2014/03/android-button-selector-tutorial-with.html

您可以在 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" />

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

android:background="@drawable/bg_button_star"

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

button.setBackgroundResource(R.drawable.bg_button_star);

当用户第一次点击按钮时,您将 Selected 状态设置为 'true'。背景随之改变。 (反之亦然 'false' 选定状态)。

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

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

您可以在 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

初始化此按钮

你可以试试这个。

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);
       }
        }
    });
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);
            }
        }
    });
}