PDM Button. OnLongClick. Control de eventos III
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:
- Por programación chamando ao método setEnabled(boolean)
- No layout, poñendo como propiedade do view: android:enabled="false"
- 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
- Partimos que xa temos creado o proxecto inicial como xa indicamos anteriormente.
- 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.
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).