Botón – Cambiar el color de fondo al hacer clic

Tengo 8 botones en mi actividad. Lo que estoy buscando es, los botones tienen un fondo por defecto y cuando se hace clic en un botón, el color de fondo debe cambiar a algún otro color. Esta parte es bastante sencillo. Pero, cuando hago clic en cualquier otro botón, el color de fondo del primer botón debe cambiar de nuevo al color predeterminado. Entiendo que esto se hará utilizando "selector states", pero no estoy muy seguro de cómo implementarlo. Cuanto más leo acerca de ello, más confundido estoy.

En este momento, el xml que tengo es el siguiente: en la carpeta dibujable

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/blue" android:state_pressed="true"/> <item android:drawable="@color/dark_grey" android:state_focused="true"/> <item android:drawable="@drawable/image_border"/> </selector> 

El drawable / image_border en el xml se utiliza para definir la forma del botón. A continuación se muestra el archivo image_border.xml

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@color/dark_grey" /> <stroke android:width="4dp" android:color="@color/light_grey" /> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" /> </shape> 

¿Puede alguien ayudarme con cómo cambiar el xml para comportarse de la manera que necesito que sea?

[EDIT 1]

Todas las respuestas a continuación apuntan hacia un tipo similar de solución. Estos son los cambios que hice. Pero, todavía, cuando presiono el botón, se vuelve al color especificado, pero inmediatamente vuelve al color predeterminado.

Button_background_blue.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/image_border_blue" android:state_pressed="true"/> <item android:drawable="@color/dark_grey" android:state_focused="true"/> <item android:drawable="@drawable/image_border"/> </selector> 

Image_border_blue.xml

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@color/blue" /> <stroke android:width="4dp" android:color="@color/blue" /> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" /> </shape> 

¿Alguna idea?

Cree una forma llamada button_pressed.xml como sigue ….

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

Supongamos que tiene un botón de remolque cuyo id s son R.id.btn y R.id.btn1 como sigue …

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="12dp" android:background="@drawable/button_pressed" android:onClick="onClick" android:text="Press Me 1" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="12dp" android:background="@drawable/button_pressed" android:onClick="onClick" android:text="Press Me 2" /> </LinearLayout> 

Escriba método onClick() como sigue … que le permitirá retener el color cambiado hasta que se presione otro botón.

 Button button; public void onClick(View v) { Drawable dr = getResources().getDrawable(R.drawable.button_pressed); dr.setColorFilter(Color.parseColor("#FF0000"), PorterDuff.Mode.SRC_ATOP); switch (v.getId()) { case R.id.btn: if (button == null) { button = (Button) findViewById(v.getId()); } else { button.setBackgroundResource(R.drawable.button_pressed); button = (Button) findViewById(v.getId()); } button.setBackgroundDrawable(dr); break; case R.id.btn2: if (button == null) { button = (Button) findViewById(v.getId()); } else { button.setBackgroundResource(R.drawable.button_pressed); button = (Button) findViewById(v.getId()); } button.setBackgroundDrawable(dr); break; default: break; } } 

Creo que ahora obtendrás lo que querías hacer.

Le sugiero este selector.

Simplemente cree un archivo selector.xml simple en una carpeta dibujable y luego agregue el selector a su botón como android:background="@drawable/selector" o por código como este: yourButton.setBackground(getResources().getDrawable(R.drawable.selector));

selector.xml :

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true" android:drawable="@android:color/holo_blue_light" /> <item android:state_enabled="true" android:state_focused="true" android:drawable="@android:color/holo_green_dark" /> <item android:state_enabled="true" android:state_selected="true" android:drawable="@android:color/holo_purple" /> <item android:drawable="@drawable/yourdrawable" /> </selector> 

El primer elemento es para pressed , el segundo para focused y el último para el estado selected .

Utilice este selector y póngalo en una carpeta dibujable y configure el fondo del botón en este selector.

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/blue" android:state_pressed="true"/> <item android:drawable="@color/AliceBlue" android:state_focused="true"/> <item android:drawable="@color/Azure"/> </selector> 

O Puede utilizar Color en lugar de Fondo. Espero eso ayude.

Cambiando el color de fondo en la disposición cuando se hace clic en el botón correspondiente de color en android

Main_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#b056ff" android:id="@+id/l1"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/b1" android:layout_gravity="center" android:text="RED"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/b2" android:layout_gravity="center" android:text="GREEN" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/b3" android:layout_gravity="center" android:text="BLUE"/> 

MyActivity.java

 package ram.android.com.cwp1; import android.app.Activity; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; /** * Created by VENKATESH on 10-Jun-16. */ public class MyActivity extends Activity implements View.OnClickListener { /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ Button r, g, b; LinearLayout ll; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); ll = (LinearLayout) findViewById(R.id.l1); r = (Button) findViewById(R.id.b1); g = (Button) findViewById(R.id.b2); b = (Button) findViewById(R.id.b3); r.setOnClickListener(this); g.setOnClickListener(this); b.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.b1: ll.setBackgroundColor(Color.RED); break; case R.id.b2: ll.setBackgroundColor(Color.GREEN); break; case R.id.b3: ll.setBackgroundColor(Color.BLUE); break; } } } 
  • Inflar diseño de forma programática en otro diseño
  • Cómo agregar varios marcos en xml
  • XML con la biblioteca SimpleXML - Rendimiento en Android
  • Android: ¿Cómo declarar el espacio de nombres XML en styles.xml?
  • Eclipse - parseSdkContent falló el error - no reconoce archivos XML
  • ¿Por qué usamos xml?
  • ¿Cómo infulo una vista personalizada en XML?
  • Android: Personajes dejados atrás en EditText
  • El soporte de diseño de derecha a izquierda está causando problemas de advertencia en el editor de xml
  • GetMap () devuelve null en Android con Google Maps API v2
  • Obtener atributos con estilo para el niño de la definición de estilo de los padres
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.