Eventos de Entrada Que Soporta Android

Para poder hacer uso de los eventos de entrada en Android como (onClick(), onLongClick(), onFocusChange(), onKey(), onTouch(), onCreateContextMenu()) utilizaremos los métodos de callback antes mencionados que tiene predefinido en su SDK, estos eventos se pueden aplicar a todos los widget Android de tipo View.

En este tutorial vamos a realizar un ejemplo de cada evento para que se entienda mejor la manera de implementarlo y en que situaciones hacer uso de estos callback.

Sin más comencemos


Evento onClick

En evento onClick es el más utilizado por las aplicaciones, ya que se ejecuta cuando el usuario realiza un toque suave en la pantalla del dispositivo.

XML

Este es el código XML que emplearemos para realizar este ejemplo.

<Button  
        android:id="@+id/bt_onClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="onClick" />

Código

Analiza el siguiente trozo de código que se encuentra dentro de la función onCreate de la activity. Estoy utilizando una función anónima para este primer ejemplo.

public class EventosEntradaActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eventos_entrada);
        //Realizamos el casting y vinculamos la variable btOnClick al widget Button con el
        //ID bt_onClick
        Button btOnClick = (Button) findViewById(R.id.bt_onClick);
        //Método onClick del botón - (anonimo)
        btOnClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(EventosEntradaActivity.this, "Evento click", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Implementando la función OnClickListener

Esta manera seria la más aconsejable por los desarrolladores de Android y para implementarlo seria de la siguiente manera.

Nota: si copias y pegas el código en tu proyecto asegúrate de importar las clases como por ejemplo del widget Button, esto se puede lograr fácilmente realizando lo siguiente; posicionate sobre la palabra Button y realiza la combinación de teclas Alt + Intro.

//Aca lo úcnico que agregamos es el (implements View.OnClickListener)
public class EventosEntradaActivity extends AppCompatActivity implements View.OnClickListener{  
    //Creamos la variable para el botón
    Button btOnClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eventos_entrada);
        //Realizamos el casting y vinculamos la variable btOnClick al widget Button con el
        //ID bt_onClick
        btOnClick = (Button) findViewById(R.id.bt_onClick);
        //Agrego el botón a la pila del evento click
        btOnClick.setOnClickListener(this);
    }
    //Método onClick
    @Override
    public void onClick(View v) {
        //Creamos el switch para evaluar según el id de View ingresado
        switch (v.getId()){
            //Caso del botón con ID bt_onClick
            case R.id.bt_onClick:
                Toast.makeText(EventosEntradaActivity.this, "Evento click", Toast.LENGTH_SHORT).show();
                break;
            //N casos para eventos click
        }
    }
}

Demo

Demostración del evento onClick.

Demostración para el evento onClick

Evento onLongClick

El evento onLongClick se ejecuta cuando el usuario realiza un click sostenido por un tiempo mas prolongado que el evento onClick.

XML

<Button  
        android:id="@+id/bt_onLongClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="onLongClick" />

Código

Código para la implementar el evento onLongClick, utilizando la interfaz OnLongClickListener.

//Agregamos lo siguiente (implements View.OnLongClickListener)
public class EventosEntradaActivity extends AppCompatActivity implements View.OnLongClickListener {  
    //Creamos la variable para el botón
    Button btOnLongClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eventos_entrada);
        //Realizamos el casting y vinculamos la variable btOnLongClick al widget Button con el
        //ID bt_onLongClick
        btOnLongClick = (Button) findViewById(R.id.bt_onLongClick);
        //Agrego el botón a la pila del evento click largo
        btOnLongClick.setOnLongClickListener(this);
    }

    //Método onLongClick
    @Override
    public boolean onLongClick(View v) {
        //Creamos el switch para evaluar según el id de View ingresado
        switch (v.getId()){
            //Caso del botón con ID bt_onLongClick
            case R.id.bt_onLongClick:
                Toast.makeText(EventosEntradaActivity.this, "Evento click long", Toast.LENGTH_SHORT).show();
                return true;
            //N casos para eventos click long
        }
        return false;
    }
}

Demo

En esta demostración no hay mucha diferencia que el evento onClick pero si funciona.

Demostración para el evento onLongClick

Evento onFocusChange

Este evento se ejecuta cuando el usuario navega hacia el widget Android o sale utilizando el teclado, para que lo entiendas mucho mejor vamos a implementarlo en un ejercicio.

XML

<EditText  
        android:id="@+id/et_focus"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text"
        android:hint="Ingresa tus nombre"
        android:nextFocusUp="@+id/et_focus2"/>

    <EditText
        android:id="@+id/et_focus2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text"
        android:hint="Ingresa tus apellidos"
        android:nextFocusDown="@+id/et_focus"/>

En este código XML hay un par de propiedades de widget que quisiera explicar. Cabe recalcar que estas propiedades se pueden aplicar a cualquier tipo de widgets Android de tipo View.

  • android:nextFocusDown: se emplea para poder dirigirnos al siguiente widget que es referenciado por su atributo ID ejemplo android:nextFocusDown="@+id/et_focus2".
  • android:nextFocusUp: al igual que el anterior se emplea para poder dirigirnos al siguiente widget que es referenciado por su atributo ID ejemplo android:nextFocusUp="@+id/et_focus".
  • Para realizar la tarea de desplazamiento entre widget también existen tres propiedades mas nextFocusForward, nextFocusRight, nextFocusLeft.

Código

Código para implementar en evento onFocusChange, utilizando la interfaz OnFocusChangeListener.

//Agregamos lo siguiente (implements View.OnFocusChangeListener)
public class EventosEntradaActivity extends AppCompatActivity implements View.OnFocusChangeListener {  
    //Creamos la variables para los EditText
    EditText etFocus, etFocus2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eventos_entrada);
        //Realizamos el casting y vinculamos las variables etFocus, etFocus2 de tipo EditText
        //IDs et_focus, et_focus2
        etFocus = (EditText) findViewById(R.id.et_focus);
        etFocus2 = (EditText) findViewById(R.id.et_focus2);

        //Agrego las cajas de texto a la pila del evento onFocusChange
        etFocus.setOnFocusChangeListener(this);
        etFocus2.setOnFocusChangeListener(this);
    }

    //Método onFocusChange
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        //Creamos el switch para evaluar según el id de View ingresado
        switch (v.getId()){
            //Caso del botón con ID et_focus
            case R.id.et_focus:
                //Este mensaje se mostrara cuando capture el foco del puntero
                //y cuando pierda el foco del puntero
                Toast.makeText(EventosEntradaActivity.this, "Evento Focus", Toast.LENGTH_SHORT).show();
                break;
            //Caso del botón con ID et_focus
            case R.id.et_focus2:
                //Este mensaje se mostrara solo cuando se capture el foco del puntero
                if(hasFocus){//Condición para evaluar si el foco del puntero el true
                    Toast.makeText(EventosEntradaActivity.this, "Evento Focus solo cuando es true", Toast.LENGTH_SHORT).show();
                }
                break;
            //N casos para eventos onFocusChange
        }
    }
}

Demo

Acá puedes apreciar su funcionamiento.

Demostración para el evento onFocusChange

Evento onKey

Este método se llama cuando el usuario se centra en un widget y presiona o libera una tecla física del dispositivo.

XML

<TextView  
        android:id="@+id/tv_reultado"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <EditText
        android:id="@+id/et_nombre"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Ingrese su nombre" />

Código

Código para la implementar el evento onKey, utilizando la interfaz OnKeyListener.

//Agregamos lo siguiente (implements View.OnKeyListener)
public class EventosEntradaActivity extends AppCompatActivity implements View.OnKeyListener{  
    //Variables a utilizar en el ejemplo
    TextView tvResultado;
    EditText etNombre;
    int mSwitch;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eventos_entrada);
        //Realizamos el casting y vinculamos las variables
        tvResultado = (TextView) findViewById(R.id.tv_reultado);
        etNombre = (EditText) findViewById(R.id.et_nombre);
        //Agrego el EditText a la pila del evento onKey
        etNombre.setOnKeyListener(this);
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        //Creamos el switch para evaluar según el ID
        switch (v.getId()) {
            //Caso según ID et_nombre
            case R.id.et_nombre:
                if(event.getAction() == KeyEvent.ACTION_DOWN){
                    //Condicionamos para realizar una acción siempre y cuando el usuario presione la tecla ENTER
                    if(keyCode == KeyEvent.KEYCODE_ENTER){
                        //aumento en 1
                        mSwitch++;
                        if(mSwitch == 1){
                            //Muestro el saludo en el TextView
                            tvResultado.setText("Hola, " + etNombre.getText().toString());
                        }else{
                            //Igualo a 0
                            mSwitch = 0;
                            //Limpio el TextView
                            tvResultado.setText("");
                        }
                    }
                }
                break;
            //N casos para eventos onKey
        }

        return false;
    }

}

Demo

Demostración funcional del evento onKey.

Demostración para el evento onKey

Evento onTouch

Este método se llama cuando el usuario realiza un acción calificada como un evento táctil, por ejemplo presionar, liberar o cualquier gesto de movimiento en la pantalla (dentro de los límites del elemento).

XML

<TextView  
        android:id="@+id/tv_touch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Tocame"
        android:textSize="30sp"/>

Código

Código para implementar en evento onTouch, utilizando la interfaz OnTouchListener.

//Agregamos lo siguiente (View.OnTouchListener)
public class EventosEntradaActivity extends AppCompatActivity implements View.OnTouchListener {  
    //Variables a utilizar en el ejemplo
    TextView tvTouch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eventos_entrada);
        //Realizamos el casting y vinculamos las variables
        tvTouch = (TextView) findViewById(R.id.tv_touch);
        //Agrego el TextView a la pila del evento onTouch
        tvTouch.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //Creamos el switch para evaluar según el ID
        switch (v.getId()) {
            //Caso según ID tv_touch
            case R.id.tv_touch:
                Toast.makeText(this, "Evento onTouch", Toast.LENGTH_SHORT).show();
                break;
            //N casos para eventos onKey
        }
        return false;
    }
}

Demo

Demostración funcional del evento onTouch.

Demostración para el evento onTouch

Evento onCreateContextMenu

Este método es llamado cuando se crea un Context Menu (como resultado de un "clic largo" sostenido). Vamos a realizar un ejercicio el cual consiste mostrar un menú contextual, una vez que el usuario haga un clic sostenido, sobre un TextView por ejemplo.

XML

Código para el TextView.

<TextView  
        android:id="@+id/tv_menuContextual"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Menú Contextual"
        android:textSize="30sp"/>

Código para el Menú, que emplearemos en este ejemplo. Nombre del archivo menu_contextual.xml

<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <item android:id="@+id/action_item1" android:title="Opción 1"/>
    <item android:id="@+id/action_item2" android:title="Opción 2"/>
</menu>  

Para crear este menú nos dijimos a la carpeta menu y si no existe la creamos.

Ubicación de la carpeta menú

Código

public class EventosEntradaActivity extends AppCompatActivity{  
  //Variable a utilizar en el ejemplo
  TextView tvMenuContextual;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_eventos_entrada);
    //Realizamos el casting para el TextView
    tvMenuContextual = (TextView) findViewById(R.id.tv_menuContextual);

    //Registrar el control para menú contextual
    registerForContextMenu(tvMenuContextual);
  }

  @Override
  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    int id = v.getId();
    MenuInflater menuInflater = getMenuInflater();
    switch (id){
      //Mostramos el menú contextual, si el usuario realiza un clic largo
      case R.id.tv_menuContextual:
          menuInflater.inflate(R.menu.menu_contextual, menu);
          break;
    }
  }
  //Sirve para realizar una acción dependiendo del ítem seleccionado
  @Override
  public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()){
      case R.id.action_item1:
          Toast.makeText(this, "Haz seleccionado la opción 1", Toast.LENGTH_SHORT).show();
          return true;
      case R.id.action_item2:
          Toast.makeText(this, "Haz seleccionado la opción 2", Toast.LENGTH_SHORT).show();
          return  true;
      default:
          return super.onContextItemSelected(item);
    }
  }
}

Demo

Demostración funcional del evento onCreateContextMenu.

Demostración para el evento onCreateContextMenu

Espero haber ayudado en algo, si no comprenden algo o cometí un error por favor estoy para aprender igual que ustedes.

Luis Rene Mas Mas's Picture

Luis Rene Mas Mas

Hola, soy desarrollador front-end & dasarrollador móvil (Android), me encanta las tecnologías web - móvil, también administro este blog.

Trujillo - Perú @01luisrene

Únete al Blog

Obtén los últimos artículos publicados directamente en tu bandeja de entrada.

O suscríbase vía RSS con Feedly!

Comparte tu Opinión