es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambiar el color de un botón después de ser seleccionado entre 4 botones disponibles, y luego volver a su estado normal si se selecciona otro botón.

Entonces tengo 4 botones y quiero hacer que si un botón es presionado por el usuario, cambie su color a rojo y se mantenga así hasta que el usuario presione los otros 3 botones.
Ver imagen aquí

He leído otros mensajes sobre esto, pero me mostraron usar el estado seleccionado y etc., pero no me funciona a mí. Y el otro uso del setBackground en el código de Java, pero estaré usando 8 botones y probablemente más, y no será eficiente hacerlo de esa manera, ¿hay alguna forma más eficiente de hacer esto?

Este es el código que tengo en el archivo drawable xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/red_maroon"></solid>
            <stroke android:color="@color/red_maroon" android:width="1dp"></stroke>
            <corners android:radius="8dp"></corners>
        </shape>
    </item>

    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/red_maroon"></solid>
            <stroke android:color="@color/red_maroon" android:width="1dp"></stroke>
            <corners android:radius="8dp"></corners>
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white"></solid>
            <stroke android:color="@color/red_maroon" android:width="1dp"></stroke>
            <corners android:radius="8dp"></corners>
        </shape>
    </item>
</selector>
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para lograr la funcionalidad deseada de cambiar el color de un botón cuando se hace clic en él y mantenerlo así hasta que se haga clic en otro botón es utilizar una combinación de los estados selector state_pressed y state_enabled con un drawable único para cada botón.

    Aquí tienes un ejemplo de cómo implementar esto en código:

    1. Crea un archivo de recursos drawable para cada botón (button1_bg.xml, button2_bg.xml, button3_bg.xml, button4_bg.xml) y define los diferentes estados para cada botón utilizando el elemento selector.

    button1_bg.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:state_pressed="true" android:drawable="@color/red"></item>
        <item android:state_enabled="false" android:drawable="@color/disabled_gray"></item>
        <item android:drawable="@color/regular_white"></item>
    
    </selector>
    

    button2_bg.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:state_pressed="true" android:drawable="@color/red"></item>
        <item android:state_enabled="false" android:drawable="@color/disabled_gray"></item>
        <item android:drawable="@color/regular_white"></item>
    
    </selector>
    

    button3_bg.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:state_pressed="true" android:drawable="@color/red"></item>
        <item android:state_enabled="false" android:drawable="@color/disabled_gray"></item>
        <item android:drawable="@color/regular_white"></item>
    
    </selector>
    

    button4_bg.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:state_pressed="true" android:drawable="@color/red"></item>
        <item android:state_enabled="false" android:drawable="@color/disabled_gray"></item>
        <item android:drawable="@color/regular_white"></item>
    
    </selector>
    
    1. Utiliza estos recursos drawable como fondo para cada botón en tu archivo de diseño XML:

    2. En tu actividad o fragmento, establece un OnClickListener para cada botón y alterna el estado habilitado de todos los botones excepto el actual:

      Button button1 = findViewById(R.id.button1);
      Button button2 = findViewById(R.id.button2);
      Button button3 = findViewById(R.id.button3);
      Button button4 = findViewById(R.id.button4);

      button1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      button1.setEnabled(false);
      button2.setEnabled(true);
      button3.setEnabled(true);
      button4.setEnabled(true);
      }
      });

      button2.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      button1.setEnabled(true);
      button2.setEnabled(false);
      button3.setEnabled(true);
      button4.setEnabled(true);
      }
      });

      button3.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      button1.setEnabled(true);
      button2.setEnabled(true);
      button3.setEnabled(false);
      button4.setEnabled(true);
      }
      });

      button4.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      button1.setEnabled(true);
      button2.setEnabled(true);
      button3.setEnabled(true);
      button4.setEnabled(false);
      }
      });

    De esta manera, cuando se hace clic en un botón, se desactivará a sí mismo y se habilitarán todos los demás botones, cambiando su fondo de color regular. El siguiente botón en el que el usuario haga clic seguirá los mismos pasos, dándole la impresión de que solo se puede activar un botón a la vez.

    Nota: Puedes ajustar los colores y estilos en los archivos drawable para que se ajusten al diseño de tu aplicación.

Comments are closed.