编程实现:OnClick 时更改按钮背景 Drawable。

13

我正在尝试切换按钮的背景可绘图形,这样当用户单击按钮时,其背景将更改,当用户再次单击按钮时,其背景将返回到默认值。以下是我的代码:

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语句的正确方式。请有人给出一种方法吗?

6个回答

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

10

您可以在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);
当用户第一次点击按钮时,您将所选状态设置为“true”。背景相应地更改。(反之亦然,“false”所选状态)。

谢谢尼科,不过我想尝试用Java来做。 - Andre Bounames

4
您可以在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进行初始化。


2
你可以尝试这个。
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);
       }
        }
    });

我将 Favorites() 函数附加到了我的 buttonStar 的 onClick 事件上。我使用了你的第一个代码,但似乎没有任何反应。 - Andre Bounames
@AndreBounames 我已经编辑了我的答案。你能再检查一下吗? - Pooja

0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接