【问题标题】:Programmatically change button background drawable onClick以编程方式更改按钮背景可绘制 onClick
【发布时间】:2015-03-29 14:07:01
【问题描述】:

我正在尝试切换按钮的背景可绘制对象,以便当用户单击按钮时,其背景会发生变化,而当用户再次单击按钮时,其背景会恢复为默认值。这是我的代码:

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

【问题讨论】:

    标签: android button background toggle drawable


    【解决方案1】:
    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);
                }
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      您可以在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”。背景随之改变。 (“假”选定状态的反之亦然)。

      【讨论】:

      • 感谢 nico,但我想尝试通过 Java 来完成。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以试试这个。

        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 上。我使用了你的第一个代码,它似乎没有做任何事情..
        • @AndreBounames 我已经编辑了我的答案。请您再检查一下。
        【解决方案5】:

        【讨论】:

          【解决方案6】:

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

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

          【讨论】: