2017-09-28 2 views
0

Mon but ici est que chaque fois qu'un bouton est cliqué, les couleurs d'arrière-plan Button reviennent à leur couleur par défaut et le Button sur lequel on clique change de couleur. J'espère faire cela dans JAVA, je pense qu'une boucle for est la voie à suivre mais je ne suis pas sûr de savoir comment éditer Button qui n'a pas été cliqué.Comment changer la couleur de fond d'un bouton qui n'a pas été cliqué?

Voici mon XML

<Button 
    android:id="@+id/but1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusableInTouchMode="true" 
    android:background="@drawable/background_selector" 
    android:onClick="buttonOn" 
    android:text="Button 1" /> 
<Button 
    android:id="@+id/but2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusableInTouchMode="true" 
    android:background="@drawable/background_selector" 
    android:onClick="buttonOn" 
    android:text="Button 2" /> 
<Button 
    android:id="@+id/but3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusableInTouchMode="true" 
    android:background="@drawable/background_selector" 
    android:onClick="buttonOn" 
    android:text="Button 3" /> 

Voici mon sélecteur

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:drawable="@drawable/background_blue" 
    android:state_pressed="true"/> 

<item android:drawable="@drawable/background_blue" 
    android:state_focused="true"/> 

<item android:drawable="@drawable/background_white"/> 
</selector> 

Voici background_white

<solid android:color="@android:color/white" /> 
<padding 
    android:bottom="1dp" 
    android:left="1dp" 
    android:right="1dp" 
    android:top="1dp" /> 
</shape> 

Voici background_blue

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="@android:color/holo_blue_bright" /> 
<padding 
    android:bottom="1dp" 
    android:left="1dp" 
    android:right="1dp" 
    android:top="1dp" /> 
</shape> 

Voici mon code java

public class MainActivity extends AppCompatActivity { 
    Button but1; 
    Button but2; 
    Button but3; 
    Button but4; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     but1 = (Button) findViewById(R.id.but1); 
     but2 = (Button) findViewById(R.id.but2); 
     but3 = (Button) findViewById(R.id.but3); 
     but4 = (Button) findViewById(R.id.but4); 
    } 

    public void buttonOn(View v) { 
     Fragment view; 
     switch(v.getId()) { 
      case R.id.but1: 
       Log.i("Button 1", "pressed"); 
       break; 
      case R.id.but2: 
       Log.i("Button 2", "pressed"); 
       break; 
      case R.id.but3: 
       Log.i("Button 3", "pressed"); 
       break; 
      case R.id.but4: 
       Log.i("Button 4", "pressed"); 
       break; 
     } 
    } 
+0

Ce que vous obtenez en sortie du code ci-dessus? – Ankita

+1

Vous pouvez sélectionner les boutons non cliqués par ID et définir l'arrière-plan. –

+0

J'ai mis à jour mon code avec ce que je suis en train de travailler mais je suis préoccupé par le fait que la fonction de journalisation de JAVA nécessite deux clics de bouton pour l'impression du texte. Que puis-je faire pour imprimer le journal sur un seul clic? – morefaster

Répondre

1

Ajouter fond comme sélecteur drawable pour ajouter button.Also android: focusableInTouchMode = "true" pour faire le bouton prendre contact lorsque vous appuyez.

<Button 
    android:id="@+id/but1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusableInTouchMode="true" 
    android:background="@drawable/background_selector" 
    android:onClick="buttonOn" 
    android:text="Button 1" /> 

Ensuite, ajoutez deux dessinables pour le bouton sélectionné et à l'intérieur background_selector désélectionné

background_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@drawable/background_blue" 
android:state_pressed="true"/> 

    <item android:drawable="@drawable/background_blue" 
android:state_focused="true"/> 

    <item android:drawable="@drawable/background_white"/> 
</selector> 

Et puis ajoutez le background_white et background_blue dans le dossier drawable

de background_white .xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 

    <solid android:color="@android:color/white" /> 

    <padding 
     android:bottom="1dp" 
     android:left="1dp" 
     android:right="1dp" 
     android:top="1dp" /> 
</shape> 

background_blue.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 

    <solid android:color="@android:color/holo_blue_bright" /> 

    <padding 
     android:bottom="1dp" 
     android:left="1dp" 
     android:right="1dp" 
     android:top="1dp" /> 
</shape> 
+0

J'ai essayé ce code, mais quand je le lance sur mon émulateur, le bouton n'apparaît pas. – morefaster

+0

J'ai réussi à faire fonctionner ce code, mais j'ai une question de suivi. Pourquoi devez-vous cliquer deux fois sur le bouton avant que log.i imprime à partir du fichier java? Je vais mettre à jour mon code principal. – morefaster

+0

comme quoi? Vous n'êtes pas en mesure de cliquer sur le bouton? – Anonymous

0
public void changeButtonColors(ViewGroup layout, int clickedButton_id) { 
    for (int i = 0; i < layout.getChildCount(); i++) { 
      View v = layout.getChildAt(i); 
      if (v instanceof Button) { 
       if (v.getId() == clickedButton_id){ 
        ((Button)v).setBackgroundColor(Color.RED); 
       }else{ 
        ((Button)v).setBackgroundColor(Color.BLUE); 
       } 
      } 
     } 
    }