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.

Android. Cómo cambiar programáticamente el color de fondo de un botón.

Necesito crear un botón programáticamente. Y mi botón puede tener un color aleatorio. Sin embargo, necesito establecer el color de fondo del botón y también el color de fondo cuando el botón está en un estado PRESIONADO.

Es decir, el color de fondo del botón en su estado normal debe ser diferente del color de fondo cuando el usuario presionó el botón.

Por ejemplo, cuando necesito un fondo diferente para un botón dependiendo del estado, uso un selector:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/shape_not_pressed" android:state_pressed="false"></item>
    <item android:drawable="@drawable/shape_pressed" android:state_pressed="true"></item>
    <item android:drawable="@drawable/shape_not_pressed"></item>
</selector>

Y en mi xml para el botón:

android:background="@drawable/selector_button"

Esta es una solución que funciona si conoces el fondo que necesitas de antemano. Sin embargo, en mi caso, estoy obteniendo dinámicamente el fondo para el botón (pressed_bg y not_pressed_bg) y por lo tanto este método no funciona para mí. ¿Es posible implementarlo programáticamente?

P.S. Necesito el efecto de presionado.

Por favor, ayúdame.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible implementar esto programáticamente. Aquí tienes un código de ejemplo en el que se crea un botón programáticamente con un color de fondo generado aleatoriamente y se define también el estado presionado.

    import android.graphics.Color;
    import android.graphics.drawable.ColorDrawable;
    import android.graphics.drawable.StateListDrawable;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            LinearLayout linearLayout = findViewById(R.id.linear_layout);
    
            // Creando un botón programáticamente
            Button button = new Button(this);
    
            // Generando un color de fondo aleatorio
            int color = Color.rgb((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255));
    
            // Estableciendo el color de fondo del botón
            button.setBackground(new ColorDrawable(color));
    
            // Definiendo el color de fondo del estado presionado
            StateListDrawable stateListDrawable = new StateListDrawable();
            ColorDrawable pressedColor = new ColorDrawable(Color.rgb(255, 0, 0));
            stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressedColor);
            stateListDrawable.addState(new int[]{}, new ColorDrawable(color));
            button.setBackground(stateListDrawable);
    
            // Añadiendo el botón al LinearLayout
            linearLayout.addView(button);
    
        }
    }
    

    En este código, se crea un nuevo botón programáticamente utilizando el constructor de la clase Button. Se genera un color de fondo aleatorio utilizando la clase Math y el método setBackgroundColor se utiliza para establecer este color como el color de fondo del botón.

    Luego, se crea un nuevo objeto StateListDrawable para definir el color de fondo del estado presionado. Contiene dos objetos ColorDrawable que representan los estados presionado y normal. Se utiliza el método addState para definir el estado presionado como el primer elemento del array y el estado normal como el segundo. Por último, se llama al método setBackground en el botón con el objeto StateListDrawable como parámetro para establecer el color de fondo del estado presionado.

    Este método te permite crear un botón programáticamente con un color de fondo generado aleatoriamente y un estado presionado definido.

Comments are closed.