Button en Android: Tipos, Estilos y Click Listeners

Button en Android: Tipos, Estilos y Click Listeners

Hola amigos 馃憢 Bienvenidos a un nuevo tutorial de Universo Android. Hoy aprenderemos todo sobre los Botones (Button) en Android, explorando los diferentes tipos, estilos personalizados, eventos de click y las mejores pr谩cticas para crear interfaces interactivas y profesionales.

Al finalizar este tutorial tendr谩s una aplicaci贸n que incluir谩:

  • Button tradicional y sus variantes
  • ImageButton con iconos
  • FloatingActionButton (FAB)
  • ToggleButton y Switch
  • Estilos personalizados con XML y Material Design
  • Click Listeners con diferentes m茅todos
  • Botones con estados (enabled, disabled, pressed)
  • Animaciones y efectos visuales

馃煩 1. ¿Qu茅 es un Button en Android?

El Button es un componente fundamental de la interfaz de usuario que permite a los usuarios ejecutar acciones mediante toques o clics. Android ofrece varios tipos de botones, cada uno optimizado para diferentes casos de uso.

馃煩 2. Tipos de Botones en Android

Android proporciona varios tipos de botones:

  • Button: Bot贸n est谩ndar con texto
  • ImageButton: Bot贸n con imagen sin texto
  • FloatingActionButton (FAB): Bot贸n flotante de Material Design
  • ToggleButton: Bot贸n de dos estados (ON/OFF)
  • Switch: Interruptor deslizante
  • RadioButton: Bot贸n de selecci贸n 煤nica
  • CheckBox: Casilla de verificaci贸n

馃煩 3. Crear el Proyecto en Android Studio

Creamos un nuevo proyecto en Android Studio con Empty Activity.

馃煩 4. Agregar Dependencias de Material Design

Abre el archivo build.gradle (Module: app) y agrega:

dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.9.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
}

Sincroniza el proyecto despu茅s de agregar las dependencias.

馃煩 5. Dise帽o XML con Diferentes Tipos de Botones

Crea un archivo llamado:

馃搫 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <!-- T铆tulo Principal -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Botones Est谩ndar"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="#2196F3"
            android:layout_marginBottom="16dp" />

        <!-- Button Normal -->
        <Button
            android:id="@+id/btnNormal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bot贸n Normal"
            android:textSize="16sp"
            android:layout_marginTop="8dp" />

        <!-- Button con Icono -->
        <Button
            android:id="@+id/btnWithIcon"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bot贸n con Icono"
            android:drawableLeft="@android:drawable/ic_dialog_email"
            android:drawablePadding="8dp"
            android:textSize="16sp"
            android:layout_marginTop="8dp" />

        <!-- Button Deshabilitado -->
        <Button
            android:id="@+id/btnDisabled"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bot贸n Deshabilitado"
            android:enabled="false"
            android:textSize="16sp"
            android:layout_marginTop="8dp" />

        <!-- Separador -->
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#CCCCCC"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp" />

        <!-- T铆tulo: Material Design Buttons -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Material Design Buttons"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="#4CAF50"
            android:layout_marginBottom="16dp" />

        <!-- Material Button Filled -->
        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnMaterialFilled"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Material Filled"
            app:cornerRadius="8dp"
            style="@style/Widget.MaterialComponents.Button"
            android:layout_marginTop="8dp" />

        <!-- Material Button Outlined -->
        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnMaterialOutlined"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Material Outlined"
            app:cornerRadius="8dp"
            app:strokeColor="#2196F3"
            app:strokeWidth="2dp"
            style="@style/Widget.MaterialComponents.Button.OutlinedButton"
            android:layout_marginTop="8dp" />

        <!-- Material Button Text -->
        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnMaterialText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Material Text"
            style="@style/Widget.MaterialComponents.Button.TextButton"
            android:layout_marginTop="8dp" />

        <!-- Material Button con Icono -->
        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnMaterialIcon"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Con Icono Material"
            app:icon="@android:drawable/ic_menu_camera"
            app:iconGravity="textStart"
            app:cornerRadius="8dp"
            android:layout_marginTop="8dp" />

        <!-- Separador -->
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#CCCCCC"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp" />

        <!-- T铆tulo: Image Buttons -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Image Buttons"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="#FF9800"
            android:layout_marginBottom="16dp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center">

            <!-- ImageButton 1 -->
            <ImageButton
                android:id="@+id/btnImage1"
                android:layout_width="64dp"
                android:layout_height="64dp"
                android:src="@android:drawable/ic_menu_camera"
                android:background="@drawable/round_button"
                android:scaleType="centerInside"
                android:layout_margin="8dp"
                android:contentDescription="C谩mara" />

            <!-- ImageButton 2 -->
            <ImageButton
                android:id="@+id/btnImage2"
                android:layout_width="64dp"
                android:layout_height="64dp"
                android:src="@android:drawable/ic_menu_gallery"
                android:background="@drawable/round_button"
                android:scaleType="centerInside"
                android:layout_margin="8dp"
                android:contentDescription="Galer铆a" />

            <!-- ImageButton 3 -->
            <ImageButton
                android:id="@+id/btnImage3"
                android:layout_width="64dp"
                android:layout_height="64dp"
                android:src="@android:drawable/ic_menu_share"
                android:background="@drawable/round_button"
                android:scaleType="centerInside"
                android:layout_margin="8dp"
                android:contentDescription="Compartir" />

        </LinearLayout>

        <!-- Separador -->
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#CCCCCC"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp" />

        <!-- T铆tulo: Toggle Buttons -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Toggle y Switch"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="#E91E63"
            android:layout_marginBottom="16dp" />

        <!-- ToggleButton -->
        <ToggleButton
            android:id="@+id/toggleButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textOn="Activado"
            android:textOff="Desactivado"
            android:layout_marginTop="8dp" />

        <!-- Switch -->
        <Switch
            android:id="@+id/switchButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Notificaciones"
            android:layout_marginTop="8dp" />

        <!-- Material Switch -->
        <com.google.android.material.switchmaterial.SwitchMaterial
            android:id="@+id/materialSwitch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Modo Oscuro"
            android:layout_marginTop="8dp" />

        <!-- Separador -->
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#CCCCCC"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp" />

        <!-- T铆tulo: Botones Personalizados -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Botones Personalizados"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="#9C27B0"
            android:layout_marginBottom="16dp" />

        <!-- Bot贸n con Gradiente -->
        <Button
            android:id="@+id/btnGradient"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bot贸n con Gradiente"
            android:textColor="#FFFFFF"
            android:background="@drawable/gradient_button"
            android:textSize="16sp"
            android:layout_marginTop="8dp" />

        <!-- Bot贸n Redondeado -->
        <Button
            android:id="@+id/btnRounded"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bot贸n Redondeado"
            android:textColor="#FFFFFF"
            android:background="@drawable/rounded_button"
            android:textSize="16sp"
            android:layout_marginTop="8dp" />

        <!-- Bot贸n con Borde -->
        <Button
            android:id="@+id/btnBorder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bot贸n con Borde"
            android:textColor="#2196F3"
            android:background="@drawable/border_button"
            android:textSize="16sp"
            android:layout_marginTop="8dp" />

        <!-- TextView para mostrar resultados -->
        <TextView
            android:id="@+id/txtResult"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Resultados aparecer谩n aqu铆"
            android:textSize="16sp"
            android:textColor="#000000"
            android:padding="16dp"
            android:background="#F5F5F5"
            android:layout_marginTop="24dp" />

    </LinearLayout>

</ScrollView>

馃煩 6. Crear Drawables para Botones Personalizados

Drawable 1: Bot贸n Redondeado

Crea res/drawable/rounded_button.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    
    <solid android:color="#2196F3" />
    
    <corners android:radius="24dp" />
    
    <padding
        android:left="16dp"
        android:top="12dp"
        android:right="16dp"
        android:bottom="12dp" />
    
</shape>

Drawable 2: Bot贸n con Gradiente

Crea res/drawable/gradient_button.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    
    <gradient
        android:startColor="#FF5722"
        android:endColor="#E91E63"
        android:angle="45"
        android:type="linear" />
    
    <corners android:radius="16dp" />
    
    <padding
        android:left="16dp"
        android:top="12dp"
        android:right="16dp"
        android:bottom="12dp" />
    
</shape>

Drawable 3: Bot贸n con Borde

Crea res/drawable/border_button.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    
    <solid android:color="#FFFFFF" />
    
    <stroke
        android:width="2dp"
        android:color="#2196F3" />
    
    <corners android:radius="8dp" />
    
    <padding
        android:left="16dp"
        android:top="12dp"
        android:right="16dp"
        android:bottom="12dp" />
    
</shape>

Drawable 4: Bot贸n Circular

Crea res/drawable/round_button.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    
    <solid android:color="#4CAF50" />
    
    <size
        android:width="64dp"
        android:height="64dp" />
    
</shape>

馃煩 7. Crear Selector para Estados del Bot贸n

Crea res/drawable/button_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <!-- Estado Presionado -->
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#1976D2" />
            <corners android:radius="8dp" />
        </shape>
    </item>
    
    <!-- Estado Deshabilitado -->
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="#CCCCCC" />
            <corners android:radius="8dp" />
        </shape>
    </item>
    
    <!-- Estado Normal -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#2196F3" />
            <corners android:radius="8dp" />
        </shape>
    </item>
    
</selector>

馃煩 8. L贸gica Java con Click Listeners

馃搫 MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.switchmaterial.SwitchMaterial;

public class MainActivity extends AppCompatActivity {

    Button btnNormal, btnWithIcon, btnDisabled, btnGradient, btnRounded, btnBorder;
    MaterialButton btnMaterialFilled, btnMaterialOutlined, btnMaterialText, btnMaterialIcon;
    ImageButton btnImage1, btnImage2, btnImage3;
    ToggleButton toggleButton;
    Switch switchButton;
    SwitchMaterial materialSwitch;
    TextView txtResult;

    int clickCount = 0;

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

        // Inicializar vistas
        initializeViews();

        // Configurar Click Listeners - M茅todo 1: Lambda
        setupLambdaListeners();

        // Configurar Click Listeners - M茅todo 2: Clase An贸nima
        setupAnonymousListeners();

        // Configurar Click Listeners - M茅todo 3: Implementar Interface
        setupInterfaceListeners();

        // Configurar Toggle y Switch
        setupToggleAndSwitch();

        // Configurar Image Buttons
        setupImageButtons();
    }

    private void initializeViews() {
        // Botones est谩ndar
        btnNormal = findViewById(R.id.btnNormal);
        btnWithIcon = findViewById(R.id.btnWithIcon);
        btnDisabled = findViewById(R.id.btnDisabled);
        btnGradient = findViewById(R.id.btnGradient);
        btnRounded = findViewById(R.id.btnRounded);
        btnBorder = findViewById(R.id.btnBorder);

        // Material Buttons
        btnMaterialFilled = findViewById(R.id.btnMaterialFilled);
        btnMaterialOutlined = findViewById(R.id.btnMaterialOutlined);
        btnMaterialText = findViewById(R.id.btnMaterialText);
        btnMaterialIcon = findViewById(R.id.btnMaterialIcon);

        // Image Buttons
        btnImage1 = findViewById(R.id.btnImage1);
        btnImage2 = findViewById(R.id.btnImage2);
        btnImage3 = findViewById(R.id.btnImage3);

        // Toggle y Switch
        toggleButton = findViewById(R.id.toggleButton);
        switchButton = findViewById(R.id.switchButton);
        materialSwitch = findViewById(R.id.materialSwitch);

        // TextView resultado
        txtResult = findViewById(R.id.txtResult);
    }

    // M脡TODO 1: Click Listener con Lambda (Java 8+)
    private void setupLambdaListeners() {
        btnNormal.setOnClickListener(v -> {
            clickCount++;
            updateResult("Bot贸n Normal clickeado - Total: " + clickCount);
        });

        btnMaterialFilled.setOnClickListener(v -> 
            updateResult("Material Filled clickeado")
        );
    }

    // M脡TODO 2: Click Listener con Clase An贸nima
    private void setupAnonymousListeners() {
        btnWithIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateResult("Bot贸n con Icono clickeado");
            }
        });

        btnGradient.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateResult("Bot贸n con Gradiente clickeado");
            }
        });
    }

    // M脡TODO 3: Click Listener implementando Interface
    private void setupInterfaceListeners() {
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btnMaterialOutlined) {
                    updateResult("Material Outlined clickeado");
                } else if (v.getId() == R.id.btnMaterialText) {
                    updateResult("Material Text clickeado");
                } else if (v.getId() == R.id.btnMaterialIcon) {
                    updateResult("Material con Icono clickeado");
                } else if (v.getId() == R.id.btnRounded) {
                    updateResult("Bot贸n Redondeado clickeado");
                } else if (v.getId() == R.id.btnBorder) {
                    updateResult("Bot贸n con Borde clickeado");
                }
            }
        };

        btnMaterialOutlined.setOnClickListener(listener);
        btnMaterialText.setOnClickListener(listener);
        btnMaterialIcon.setOnClickListener(listener);
        btnRounded.setOnClickListener(listener);
        btnBorder.setOnClickListener(listener);
    }

    // M脡TODO 4: Click desde XML (onClick attribute)
    public void onButtonClick(View view) {
        updateResult("M茅todo onClick desde XML");
    }

    private void setupToggleAndSwitch() {
        // ToggleButton
        toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                String status = isChecked ? "Activado" : "Desactivado";
                updateResult("Toggle Button: " + status);
            }
        });

        // Switch
        switchButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
            String status = isChecked ? "Notificaciones ON" : "Notificaciones OFF";
            updateResult(status);
            Toast.makeText(this, status, Toast.LENGTH_SHORT).show();
        });

        // Material Switch
        materialSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
            String status = isChecked ? "Modo Oscuro Activado" : "Modo Oscuro Desactivado";
            updateResult(status);
            
            // Cambiar color de fondo como ejemplo
            if (isChecked) {
                findViewById(android.R.id.content).setBackgroundColor(0xFF424242);
            } else {
                findViewById(android.R.id.content).setBackgroundColor(0xFFFFFFFF);
            }
        });
    }

    private void setupImageButtons() {
        btnImage1.setOnClickListener(v -> {
            updateResult("C谩mara clickeada");
            Toast.makeText(this, "Abrir C谩mara", Toast.LENGTH_SHORT).show();
        });

        btnImage2.setOnClickListener(v -> {
            updateResult("Galer铆a clickeada");
            Toast.makeText(this, "Abrir Galer铆a", Toast.LENGTH_SHORT).show();
        });

        btnImage3.setOnClickListener(v -> {
            updateResult("Compartir clickeado");
            Toast.makeText(this, "Compartir contenido", Toast.LENGTH_SHORT).show();
        });
    }

    // M脡TODO 5: Long Click Listener
    private void setupLongClickListener() {
        btnNormal.setOnLongClickListener(v -> {
            updateResult("Long Click detectado en Bot贸n Normal");
            Toast.makeText(this, "Mantuviste presionado el bot贸n", Toast.LENGTH_SHORT).show();
            return true; // true = evento consumido
        });
    }

    // M脡TODO 6: Habilitar/Deshabilitar bot贸n din谩micamente
    private void toggleButtonState() {
        if (btnDisabled.isEnabled()) {
            btnDisabled.setEnabled(false);
            btnDisabled.setText("Deshabilitado");
        } else {
            btnDisabled.setEnabled(true);
            btnDisabled.setText("Habilitado");
        }
    }

    private void updateResult(String message) {
        txtResult.setText(message);
    }
}

馃煩 9. FloatingActionButton (FAB)

Agrega un FAB al layout:

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Tu contenido aqu铆 -->

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        android:src="@android:drawable/ic_input_add"
        app:backgroundTint="#4CAF50"
        app:tint="#FFFFFF" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

En Java:

FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(v -> {
    Toast.makeText(this, "FAB clickeado", Toast.LENGTH_SHORT).show();
});

馃煩 10. Crear Estilos Reutilizables

Crea un archivo res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    
    <!-- Estilo para Bot贸n Principal -->
    <style name="PrimaryButton" parent="Widget.MaterialComponents.Button">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="backgroundTint">#2196F3</item>
        <item name="cornerRadius">8dp</item>
        <item name="android:layout_marginTop">8dp</item>
    </style>
    
    <!-- Estilo para Bot贸n Secundario -->
    <style name="SecondaryButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">#2196F3</item>
        <item name="strokeColor">#2196F3</item>
        <item name="strokeWidth">2dp</item>
        <item name="cornerRadius">8dp</item>
        <item name="android:layout_marginTop">8dp</item>
    </style>
    
    <!-- Estilo para Bot贸n de Texto -->
    <style name="TextButton" parent="Widget.MaterialComponents.Button.TextButton">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">#2196F3</item>
        <item name="android:layout_marginTop">8dp</item>
    </style>
    
    <!-- Estilo para Bot贸n Peligroso -->
    <style name="DangerButton" parent="Widget.MaterialComponents.Button">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="backgroundTint">#F44336</item>
        <item name="cornerRadius">8dp</item>
        <item name="android:layout_marginTop">8dp</item>
    </style>
    
</resources>

Aplicar estilos en XML:

<com.google.android.material.button.MaterialButton
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Bot贸n Primario"
    style="@style/PrimaryButton" />

馃煩 11. Propiedades Importantes de Button

PropiedadDescripci贸n
android:textTexto del bot贸n
android:textColorColor del texto
android:textSizeTama帽o del texto
android:backgroundFondo del bot贸n
android:enabledHabilita/deshabilita el bot贸n
android:onClickM茅todo a ejecutar al hacer click (XML)
android:drawableLeftIcono a la izquierda
android:drawablePaddingEspacio entre icono y texto
app:cornerRadiusRadio de las esquinas (Material)
app:strokeColorColor del borde (Material)
app:strokeWidthGrosor del borde (Material)
app:iconIcono del bot贸n (Material)
app:iconGravityPosici贸n del icono (Material)

馃煩 12. Button con Animaci贸n

private void animateButton(Button button) {
    // Animaci贸n de escala
    button.animate()
        .scaleX(1.1f)
        .scaleY(1.1f)
        .setDuration(200)
        .withEndAction(() -> {
            button.animate()
                .scaleX(1.0f)
                .scaleY(1.0f)
                .setDuration(200)
                .start();
        })
        .start();
}

馃煩 13. M茅todos para Configurar Click Listeners

M茅todo 1: Lambda (Recomendado - Java 8+)

button.setOnClickListener(v -> {
    // Tu c贸digo aqu铆
});

M茅todo 2: Clase An贸nima

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Tu c贸digo aqu铆
    }
});

M茅todo 3: Desde XML (onClick attribute)

<Button
    android:onClick="myMethod"
    android:text="Click Me" />
public void myMethod(View view) {
    // Tu c贸digo aqu铆
}

M茅todo 4: Implementar Interface en Activity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button = findViewById(R.id.button);
        button.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        // Tu c贸digo aqu铆
    }
}

▶️ C贸mo Ejecutar tu Aplicaci贸n

  1. Abre Android Studio
  2. Presiona Run para ejecutar el proyecto
  3. Si no tienes un emulador, crea uno desde AVD Manager
  4. Ver谩s todos los tipos de botones con diferentes estilos funcionando

馃И Resultado Final

Tu aplicaci贸n mostrar谩:

  • Botones est谩ndar con diferentes estilos
  • Material Design Buttons (Filled, Outlined, Text)
  • Image Buttons circulares con iconos
  • Toggle Button y Switch con estados
  • Botones personalizados (gradientes, bordes, redondeados)
  • Click Listeners funcionando con diferentes m茅todos
  • Estados visuales (normal, presionado, deshabilitado)

馃摜 Descargar Proyecto de Ejemplo

Puedes descargar el proyecto completo desde el siguiente enlace:

馃憠 Descargar

馃檶 Gracias por Visitar mi Blog

Si este tutorial te fue 煤til:

✔️ Comp谩rtelo
✔️ D茅jame un comentario
✔️ S铆gueme para m谩s contenido sobre Android y programaci贸n

¡Estoy aqu铆 para ayudarte!

❓ Preguntas Frecuentes (FAQ)

1. ¿Cu谩l es la diferencia entre Button y MaterialButton?
MaterialButton es parte de Material Design y ofrece m谩s opciones de personalizaci贸n como bordes, iconos integrados, esquinas redondeadas y estilos predefinidos m谩s modernos que el Button est谩ndar.

2. ¿C贸mo puedo deshabilitar un bot贸n temporalmente?
Usa el m茅todo button.setEnabled(false) para deshabilitar y button.setEnabled(true) para habilitar. Los botones deshabilitados no responden a clicks y cambian su apariencia visual autom谩ticamente.

3. ¿Cu谩l es el mejor m茅todo para configurar Click Listeners?
El m茅todo Lambda es el m谩s limpio y legible en Java 8+. La clase an贸nima es 煤til cuando necesitas compatibilidad con versiones antiguas o l贸gica m谩s compleja dentro del listener.

4. ¿Puedo agregar m煤ltiples iconos a un bot贸n?
Con Button est谩ndar puedes usar drawableLeft, drawableRight, drawableTop y drawableBottom. Con MaterialButton puedes usar la propiedad app:icon y controlar su posici贸n con app:iconGravity.

No hay comentarios:

Publicar un comentario