PDM Button. OnLongClick. Control de eventos III

De MediaWiki
Saltar a: navegación, buscar

Introdución

  • Para continuar coa xestión de eventos imos ver como xestionar un click longo.
  • Este tipo de evento podemos asocialo a calquera view (unha ListView, un EditText, un TextView).
Normalmente levará consigo a aparición dalgún tipo de Dialog (por exemplo, nunha lista de elementos para borrar un deles,...)
Veremos máis adiante nesta Wiki como crear ventás de diálogos.



Método onLongClick()

  • Cando sobre unha vista se preme por duración de 1 segundo ou máis lánzase o evento LongClick que é capturado polo método onLongClick() asociado á interface OnLongClickListener.
  • Igual que fixemos con a forma de xestionar un Click sobre un View, agora deberemos facer uso do método setOnLongClickListener() o cal permite 'rexistrar' a interface que xestiona o evento.
Dito método espera recibir como parámetro un obxecto dunha clase que implemente a interface OnLongClickListener.
Podemos facelo de forma anónima ou implementando dito interface nunha clase calquera ou na propia Activity.
Ao facelo deberemos de implementar o método da interface que neste caso é o método onLongClick().


  • O método onLongClick() devolve un booleano para poder comprobar se o evento se consumou ou non. Se chegamos a premer por un segundo (ou máis) ou non.
    • Devolve true se puidemos capturar o evento e xa non fai nada máis.
    • Devolve false se non se puido capturar o evento e continua chamando a outros escoitadores tipo on-Click.


  • Relacionado co anterior, podemos facer que un determinado view sexa ou non clickable da forma:
Pero ao facelo desta forma, se despois xestionamos o evento facendo uso do método setOnClickLisntener() ou setOnLongClickListener(), dita propiedade se modifica a true, polo que deixa de ter efecto.
  • Podemos facer que un determinado view deixe de ser xestionado o seu evento de click:
  • Desabilitando dito view:
  • Pasando como obxecto no método o valor null da forma:
  • view.setOnClickListener(null)
  • view.setOnLongClickListener(null)



Caso Práctico

Se non o temos creado antes, crea un paquete de nome UI como un subpaquete do teu paquete principal.
Dentro do paquete UI, crearemos un novo paquete de nome: Buttons.



  • Dentro do paquete Buttons crear unha nova 'Empty Activity' de nome: UD02_02_Buttons_LongClick de tipo Launcher e sen compatibilidade.
Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.


  • Esta actividade ten 2 vistas:
    • Un botón que se pode facer Click (capturado a través dun Listener) e LongClick (capturado a través dun Listener)
    • Unha etiqueta de texto (en 2 liñas) na que se pode facer Click (hai que habilitalo) e LongClick. Neste último caso os dous eventos captúranse con cadanseu Listener.

PDM LongClick 1.jpg




XML do Layout

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    xmlns:app="http://schemas.android.com/apk/res-auto"
  4.    xmlns:tools="http://schemas.android.com/tools"
  5.    android:layout_width="match_parent"
  6.    android:layout_height="match_parent"
  7.    tools:context=".UI.Buttons.UD02_02_Buttons_LongClick">
  8.  
  9.  
  10.     <Button
  11.        android:id="@+id/btnPulsame_UD02_02_Buttons_LongClick"
  12.        android:layout_width="0dp"
  13.        android:layout_height="wrap_content"
  14.        android:layout_marginEnd="8dp"
  15.        android:layout_marginStart="8dp"
  16.        android:layout_marginTop="8dp"
  17.        android:text="Botón:\n
  18.                     onClick Layout\n
  19.                     onLongClick Listener"
  20.        android:textAlignment="viewStart"
  21.        app:layout_constraintEnd_toEndOf="parent"
  22.        app:layout_constraintStart_toStartOf="parent"
  23.        app:layout_constraintTop_toTopOf="parent" />
  24.  
  25.     <TextView
  26.        android:id="@+id/tvTexto_UD02_02_Buttons_LongClick"
  27.        android:layout_width="0dp"
  28.        android:layout_height="wrap_content"
  29.        android:layout_marginEnd="8dp"
  30.        android:layout_marginStart="8dp"
  31.        android:layout_marginTop="8dp"
  32.        android:text="Fai click e
  33.                     \nPreme aquí por máis de 1 seg"
  34.        android:textSize="20sp"
  35.        app:layout_constraintEnd_toEndOf="parent"
  36.        app:layout_constraintStart_toStartOf="parent"
  37.        app:layout_constraintTop_toBottomOf="@+id/btnPulsame_UD02_02_Buttons_LongClick" />
  38. </android.support.constraint.ConstraintLayout>




Código Java

  1. package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.Buttons;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9.  
  10. import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
  11.  
  12. public class UD02_02_Buttons_LongClick extends Activity {
  13.  
  14.     private void xesionarEventos(){
  15.  
  16.         // Rexistrmos os eventos de LongClick e Click sobre o botón
  17.         Button boton = (Button) findViewById(R.id.btnPulsame_UD02_02_Buttons_LongClick);
  18.         boton.setOnLongClickListener(new View.OnLongClickListener() {
  19.             @Override
  20.             public boolean onLongClick(View v) {
  21.                 // TODO Auto-generated method stub
  22.                 Toast.makeText(v.getContext(), "Premeches 1 seg no botón", Toast.LENGTH_SHORT).show();
  23.                 return true;
  24.             }
  25.         });
  26.         boton.setOnClickListener(new View.OnClickListener() {
  27.             @Override
  28.             public void onClick(View v) {
  29.                 Toast.makeText(getApplicationContext(), "Fixeches Click no botón", Toast.LENGTH_SHORT).show();
  30.             }
  31.         });
  32.  
  33.  
  34.         // Rexistrmos os eventos de LongClick e Click sobre o TextView
  35.         TextView tv = (TextView) findViewById(R.id.tvTexto_UD02_02_Buttons_LongClick);
  36.         tv.setOnLongClickListener(new View.OnLongClickListener() {
  37.             @Override
  38.             public boolean onLongClick(View v) {
  39.                 // TODO Auto-generated method stub
  40.                 Toast.makeText(v.getContext(), "Premeches 1 seg na etiqueta de texto", Toast.LENGTH_SHORT).show();
  41.                 return true;
  42.             }
  43.         });
  44.  
  45.         tv.setOnClickListener(new View.OnClickListener() {
  46.  
  47.             @Override
  48.             public void onClick(View v) {
  49.                 // TODO Auto-generated method stub
  50.                 Toast.makeText(v.getContext(), "Fixeches click na etiqueta de texto", Toast.LENGTH_SHORT).show();
  51.             }
  52.         });
  53.  
  54.     }
  55.  
  56.     @Override
  57.     protected void onCreate(Bundle savedInstanceState) {
  58.         super.onCreate(savedInstanceState);
  59.         setContentView(R.layout.activity_ud02_02__buttons__long_click);
  60.  
  61.         xesionarEventos();
  62.     }
  63. }
  • Liñas 18-25:
    • Cando se faga un LongClick en boton este executará o método onLonClick() que devolverá true se se chegou a consumar o evento.
    • Probar a cambiar a liña 26 a return false e executar a aplicación. Que pasa?


  • Liñas 36-43:
    • Acontece o mesmo que no caso anterior, so que para a etiqueta de texto.


  • Liñas 45-52:
    • Se na etiqueta sucede o evento Click chámase ao Listener correspondente da etiqueta.





-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).