Desarrollo en Android - Eventos y Logs
En ocasiones es útil o necesario programar 2 o más eventos diferentes a un mismo widget, como por ejemplo un click y un longclick, de forma que el componente pueda mostrar información o ejecutar otra tarea dependiendo de las necesidades del usuario.
Para hacer esto se escuchan los eventos y se asignan comportamientos a los componentes.
En este tutorial se detectarán los eventos Click y LongClick directamente en el Layout y estos eventos activarán registros de Logs que permitirán al des arrollador conocer que esta pasando en el activity.
1. Para este tutorial se utilizará el LinearLayout para escuchar los eventos que pasen en todo el activity, para esto además de los parámetros habituales se agrega el id para poder vincular la UI con la lógica del proyecto.
xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:id="@+id/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: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="mx.blogspot.salvadorhm.doseventos.MainActivity">
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:id="@+id/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: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="mx.blogspot.salvadorhm.doseventos.MainActivity">
</LinearLayout>
2. Dentro de la clase se crea un objeto de tipo LinearLayout.
public class MainActivity extends AppCompatActivity {
private LinearLayout linearLayout;
private LinearLayout linearLayout;
3. Se inicializa el objeto linearLayout dentro del método onCreate tal como se hace con los botones y otros widgets.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
4. En este ejemplo se crea un método de nombre linearLayout_onClic() que es donde se programa lo que se desea que se ejecute al hacer clic en el Activity, como se puede ver se utiliza el objeto Log y el método d, este método corresponde al debug.
El objeto Log permite separar los mensajes que serán visibles en la consola de desarrollador, y son los siguientes:
Debug - d (depuración)
Verbose - v (Texto explicativo más detallado)
Info - i (Información)
Warn - w (Adverstencia)
Error - e (Errores)
Estas letras permiten clasificar los tipos de Log que se muestran, además de facilitar su lectura directamente en Android Studio en el Android Monitor.
private void linearLayout_onClick(){
Log.d("linearLayout","Click");
}
Log.d("linearLayout","Click");
}
5. De forma similar se programa el método linearLayout_onLongClick() para indicar el comportamiento al hacer click por 2 o más segundos dentro del activity.
La sintaxis sugerida es el nombreDelWidget_EventoAProgramar.
private void linearLayout_onLongClick(){
Log.d("linearLayout","LongClick");
}
Log.d("linearLayout","LongClick");
}
6. Para programar el clic se crea un Listener de tipo onClickListener, tal como se muestra en el siguiente código, y se sobre escribe el médoto onClick.
Este Listener puede ser utilizado por N cantidad de widgets, y una forma para identificar al componente que lanzo este evento es con if, comparando la view que genero el evento con el componente que se creo e inicializo anteriormente en el punto 3.
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v == linearLayout)
linearLayout_onClick();
}
};
@Override
public void onClick(View v) {
if(v == linearLayout)
linearLayout_onClick();
}
};
7. De forma similar se crea el Listener OnLongClickListener y se sobre escribe el método onLongClick, a diferencia de onClick este evento devuelve un valor boolean, esto para indicarle al SO Android que solo ejecute el evento onLongClick y no ambos.
private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(v == linearLayout)
linearLayout_onLongClick();
return true;
}
};
@Override
public boolean onLongClick(View v) {
if(v == linearLayout)
linearLayout_onLongClick();
return true;
}
};
8. Una vez creado los métodos que se ejecutarán, y los Listener que atrapan los eventos, se asigna al layout los Listener para que puedan atraparse los eventos Click y LongClick, tal como se muestra en el siguiente código.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
linearLayout.setOnClickListener(onClickListener);
linearLayout.setOnLongClickListener(onLongClickListener);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
linearLayout.setOnClickListener(onClickListener);
linearLayout.setOnLongClickListener(onLongClickListener);
9. El código completo se muestra a continuación.
package mx.blogspot.salvadorhm.doseventos;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
private LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
linearLayout.setOnClickListener(onClickListener);
linearLayout.setOnLongClickListener(onLongClickListener);
}
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v == linearLayout)
linearLayout_onClick();
}
};
private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(v == linearLayout)
linearLayout_onLongClick();
return true;
}
};
private void linearLayout_onClick(){
Log.d("linearLayout","Click");
}
private void linearLayout_onLongClick(){
Log.d("linearLayout","LongClick");
}
}
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
private LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
linearLayout.setOnClickListener(onClickListener);
linearLayout.setOnLongClickListener(onLongClickListener);
}
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v == linearLayout)
linearLayout_onClick();
}
};
private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(v == linearLayout)
linearLayout_onLongClick();
return true;
}
};
private void linearLayout_onClick(){
Log.d("linearLayout","Click");
}
private void linearLayout_onLongClick(){
Log.d("linearLayout","LongClick");
}
}
10. El resultado de la ejecución se muestra a continuación, se puede apreciar que en el Android Monitor aparecen los mensajes en la terminal dependiendo del evento que se atrapo.
11. En el Android Monitor se pueden filtrar los mensajes de Log que se quieren visualizar.
Comentarios