web-dev-qa-db-ja.com

プログラムでボタンの背景ドローアブルonClickを変更する

ユーザーがボタンをクリックすると背景が変更され、ユーザーがもう一度ボタンをクリックすると背景がデフォルトに戻るように、ボタンの背景ドローアブルを切り替えようとしています。これが私のコードです:

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ステートメントでドローアブルを使用する方法とは異なると確信しています。誰かがそれを行う方法を提案できますか?

10
Andre Bounames
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);
            }
        }
    });
}
16
li2

ドローアブルフォルダーに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」選択状態の逆)。

7
nicopasso

あなたのような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_offまたはbtn_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);
       }
        }
    });
2
Pooja

この場合、Buttonを使用する代わりに、ToggleButtonを使用する必要があります。

そのためのAPIガイドがあります: http://developer.Android.com/guide/topics/ui/controls/togglebutton.html

0
John Cordeiro

そのようにしないでください。代わりにセレクターリソースを使用してください http://www.compiletimeerror.com/2014/03/Android-button-selector-tutorial-with.html

0
Quark