Buscar..


Sintaxis

  • <Botón ... />
  • Android: onClick = "nombre de método"
  • button.setOnClickListener (nuevo OnClickListener () {...});
  • clase pública nombre de clase implementa View.OnLongClickListener

en línea enClickListener

Supongamos que tenemos un botón (podemos crearlo mediante programación o vincularlo desde una vista mediante findViewbyId (), etc.)

Button btnOK = (...) 

Ahora, crea una clase anónima y configúrala en línea.

btnOk.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do stuff here...
    }
});

Usando el diseño para definir una acción de clic

Cuando creamos un botón en el diseño, podemos usar el atributo android:onClick para hacer referencia a un método en el código para manejar los clics.

Botón

<Button
    android:width="120dp"
    android:height="wrap_content"
    android:text="Click me"
    android:onClick="handleClick" />

Luego, en tu actividad, crea el método handleClick .

public void handleClick(View v) {
    // Do whatever.
}

Usando el mismo evento de clic para una o más Vistas en el XML

Cuando creamos una Vista en diseño, podemos usar el atributo android: onClick para hacer referencia a un método en la actividad asociada o fragmento para manejar los eventos de clic.

Diseño XML

<Button android:id="@+id/button"
    ...
    // onClick should reference the method in your activity or fragment
    android:onClick="doSomething" />

// Note that this works with any class which is a subclass of View, not just Button
<ImageView android:id="@+id/image"
    ...
    android:onClick="doSomething" />

Código de actividad / fragmento

En su código , cree el método que nombró, donde v será la vista que se tocó, y haga algo para cada vista que llame a este método.

public void doSomething(View v) {
    switch(v.getId()) {
        case R.id.button:
            // Button was clicked, do something.
            break;
        case R.id.image:
            // Image was clicked, do something else.
            break;
    }
}

Si lo desea, también puede usar un método diferente para cada Vista (en este caso, por supuesto, no tiene que verificar la ID).

Escuchando los eventos de clic largo

Para capturar un clic prolongado y usarlo, debe proporcionar el oyente adecuado al botón:

View.OnLongClickListener listener = new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        Button clickedButton = (Button) v;
        String buttonText = clickedButton.getText().toString();
        Log.v(TAG, "button long pressed --> " + buttonText);
        return true;
    }
};

button.setOnLongClickListener(listener);

Definiendo el oyente externo

¿Cuándo debo usarlo?

  • Cuando el código dentro de un oyente en línea es demasiado grande y su método / clase se vuelve feo y difícil de leer
  • Desea realizar la misma acción en varios elementos (vista) de su aplicación

Para lograr esto, necesita crear una clase que implemente uno de los escuchas en la API View .

Por ejemplo, brinde ayuda cuando haga clic en cualquier elemento:

public class HelpLongClickListener implements View.OnLongClickListener 
{
    public HelpLongClickListener() {
    }

    @Override 
    public void onLongClick(View v) {
        // show help toast or popup
    }
}

Entonces solo necesita tener un atributo o variable en su Activity para usarlo:

HelpLongClickListener helpListener = new HelpLongClickListener(...);

button1.setOnClickListener(helpListener);
button2.setOnClickListener(helpListener);
label.setOnClickListener(helpListener);
button1.setOnClickListener(helpListener);

NOTA: la definición de escuchas en una clase separada tiene una desventaja, no puede acceder a los campos de la clase directamente, por lo que debe pasar los datos (contexto, vista) a través del constructor a menos que haga públicos los atributos o defina captadores.

Personalizado Click Listener para evitar múltiples clics rápidos

Para evitar que un botón se dispare varias veces en un corto período de tiempo (digamos 2 clics en 1 segundo, lo que puede causar problemas graves si no se controla el flujo), se puede implementar un SingleClickListener personalizado.

Este ClickListener establece un intervalo de tiempo específico como umbral (por ejemplo, 1000ms).
Cuando se hace clic en el botón, se ejecutará una comprobación para ver si el disparador se ejecutó en el último período de tiempo que definió, y si no, se activará.

public class SingleClickListener implements View.OnClickListener {

    protected int defaultInterval;
    private long lastTimeClicked = 0;

    public SingleClickListener() {
        this(1000);
    }

    public SingleClickListener(int minInterval) {
        this.defaultInterval = minInterval;
    }

    @Override
    public void onClick(View v) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return;
        }
        lastTimeClicked = SystemClock.elapsedRealtime();
        performClick(v);
    }

    public abstract void performClick(View v);

}

Y en la clase, el SingleClickListener está asociado al botón en juego

myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new SingleClickListener() {
    @Override
    public void performClick(View view) {
        // do stuff
    }
});

Personalizar estilo de botón

Hay muchas formas posibles de personalizar el aspecto de un botón. Este ejemplo presenta varias opciones:


Opción 0: usar ThemeOverlay (actualmente la forma más fácil / rápida)

Crea un nuevo estilo en tu archivo de estilos:

styles.xml

<resources>
    <style name=“mybutton” parent=”ThemeOverlay.AppCompat.Ligth”>
        <!-- customize colorButtonNormal for the disable color -->
        <item name="colorButtonNormal">@color/colorbuttonnormal</item>
        <!-- customize colorAccent for the enabled color -->
        <item name="colorButtonNormal">@color/coloraccent</item>
    </style>
</resources>

Luego, en el diseño donde coloca su botón (por ejemplo, MainActivity):

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

            <Button
                android:id="@+id/mybutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello"
                android:theme="@style/mybutton"
                style="@style/Widget.AppCompat.Button.Colored"/>

</LinearLayout>

Opción 1: Crea tu propio estilo de botón

En values ​​/ styles.xml, cree un nuevo estilo para su botón:

styles.xml

<resources>
        <style name="mybuttonstyle" parent="@android:style/Widget.Button">
            <item name="android:gravity">center_vertical|center_horizontal</item>
            <item name="android:textColor">#FFFFFFFF</item>
            <item name="android:shadowColor">#FF000000</item>
            <item name="android:shadowDx">0</item>
            <item name="android:shadowDy">-1</item>
            <item name="android:shadowRadius">0.2</item>
            <item name="android:textSize">16dip</item>
            <item name="android:textStyle">bold</item>
            <item name="android:background">@drawable/button</item>
        </style>
    </resources>

Luego, en el diseño donde coloca su botón (por ejemplo, en MainActivity):

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

            <Button
                android:id="@+id/mybutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello"
                android:theme="@style/mybuttonstyle"/>

</LinearLayout>

Opción 2: Asigna un dibujo para cada uno de tus estados de botón

Cree un archivo xml en la carpeta dibujable llamada 'mybuttondrawable.xml' para definir el recurso dibujable de cada uno de los estados de sus botones:

drawable / mybutton.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@drawable/mybutton_disabled" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/mybutton_pressed" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@drawable/mybutton_focused" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/mybutton_enabled" />
</selector>

Cada uno de esos elementos dibujables puede ser imágenes (por ejemplo, mybutton_disabled.png) o archivos xml definidos por usted y almacenados en la carpeta de elementos dibujables. Por ejemplo:

drawable / mybutton_disabled.xml

<?xml version="1.0" encoding="utf-8"?>

    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <gradient
            android:startColor="#F2F2F2"
            android:centerColor="#A4A4A4"
            android:endColor="#F2F2F2"
            android:angle="90"/>
        <padding android:left="7dp"
            android:top="7dp"
            android:right="7dp"
            android:bottom="7dp" />
        <stroke
            android:width="2dip"
            android:color="#FFFFFF" />
        <corners android:radius= "8dp" />
    </shape>

Luego, en el diseño donde coloca su botón (por ejemplo, MainActivity):

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

            <Button
                android:id="@+id/mybutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello"
                android:background="@drawable/mybuttondrawable"/>

</LinearLayout>

Opción 3: Agregue su estilo de botón a su tema de aplicación

Puede anular el estilo de botón de Android predeterminado en la definición del tema de su aplicación (en values ​​/ styles.xml).

styles.xml

<resources>
     <style name="AppTheme" parent="android:Theme">
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
              <item name="android:button">@style/mybutton</item>
     </style>
    
     <style name="mybutton" parent="android:style/Widget.Button">
             <item name="android:gravity">center_vertical|center_horizontal</item>
                <item name="android:textColor">#FFFFFFFF</item>
                <item name="android:shadowColor">#FF000000</item>
                <item name="android:shadowDx">0</item>
                <item name="android:shadowDy">-1</item>
                <item name="android:shadowRadius">0.2</item>
                <item name="android:textSize">16dip</item>
                <item name="android:textStyle">bold</item>
                <item name="android:background">@drawable/anydrawable</item>
     </style>
</resources>

Opción 4: Superponer un color en el estilo de botón predeterminado programáticamente

Simplemente encuentre el botón en su actividad y aplique un filtro de color:

Button mybutton = (Button) findViewById(R.id.mybutton);
mybutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY)

Puedes consultar diferentes modos de fusión aquí y buenos ejemplos aquí .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow