PDM Button. OnLongClick. Control de eventos III

De MediaWiki
Ir a la navegación Ir a la búsqueda

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:
  • Desabilitando dito view:
  • Pasando como obxecto no método o valor null da forma:
  • view.setOnClickListener(null)
  • view.setOnLongClickListener(null)
  • Poñendo na propiedade do view: android:clickeable="false" (tamén desactiva o click) ou a propiedade android:longClickable="false" para desactivar soamente o long click.
Lembrar que se empregamos esta opción e temos a nivel de código o método setOn(Long/Click)Listener posto, ditas propiedades pasan a ter o valor true outra vez, como xa vimos no TextView e teremos que chamar ao método setClickable(false).



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).