2015-03-29 4 views
5

Я пытаюсь переключить фоновые рисунки на моей кнопке, так что, когда пользователь нажимает кнопку, его фон изменяется, и когда пользователь снова нажимает кнопку, его фон возвращается к defaul. Вот мой код:Programmatically change button background drawable 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 вводимого коэффициента отчетности. Может кто-нибудь предложить способ сделать это?

ответ

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

да, это работает! спасибо за идею –

6

Вы можете создать 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" /> 

Затем вы должны назначить этот Drawable файл на кнопку свойства фона в файле макета.

android:background="@drawable/bg_button_star" 

Если вы хотите сделать это программно, то вы просто должны сделать:

button.setBackgroundResource(R.drawable.bg_button_star); 

Когда пользователь нажимает в первый раз на кнопку, вы установите выбранное состояние «истина». Фон меняется соответственно. (наоборот) для «ложного» выбранного состояния).

+0

Спасибо Nico, но я хотел бы попробовать сделать это с помощью Java. –

1

Вы можете сделать в вашем 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); 
} 

Очевидно, что лучше в теге перед, если и другое заявление на основании по вашей информации. Я не знаю остальную часть вашего кода и как вы проверяете, не должна ли эта кнопка быть инициализирована с помощью ресурса, который можно извлечь, btn_star_off или btn_star_on

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

Я прикрепляю функцию Favorites() к onClick моей кнопкиStar. Я использовал ваш первый код, он ничего не делает .. –

+0

@AndreBounames Я отредактировал свой ответ. Повторите попытку. – Pooja