Android
Botón
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í .