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
- Android, envío de XML a través de HTTP POST (SOAP)
- Emoji símbolo 👍 en string.xml bloquea la aplicación
- No se ha seleccionado ningún destino de reproducción con Android Studio
- RecyclerView wrap_content
- Combinando wrap_content en el padre y fill_parent en el niño
<?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?
- Android: html en strings.xml
- Android EditText siguiente foco
- Botón de acción flotante de Android Semi Transparente Color de fondo
- AVD Manager pierde las definiciones de dispositivos creadas por el usuario después de cerrar y volver a abrirse
- Android: java.lang.ClassCastException: android.widget.imageView no se puede convertir en android.widget.textView
- Android Databinding atributo xml duplicado
- ¿Atajos estáticos del androide para los sabores múltiples?
- La aplicación de conversión de Android se bloquea en convertir
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; } } }
- Carga de spinner sqlite con texto y valor
- No se pueden cambiar los colores de Logcat de Android Studio