Autore Topic: onTouchListener e onClickListener  (Letto 260 volte)

Offline capitancooker

  • Utente junior
  • **
  • Post: 56
  • Marco
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5, Asus Zenpad S 8.0
  • Sistema operativo:
    Mac OSX El Capitan
onTouchListener e onClickListener
« il: 22 Agosto 2016, 17:39:11 CEST »
0
Ho un banale problema al quale non riesco, per miei limiti, a trovare una soluzione.

Ho un layout con una TextView che rappresenta un valore numerico che incremento/decremento tramite uno swipe sullo schermo.
Ho applicato GestureDetector nella view principale a tutto schermo tramite onTouchListener e tutto funziona a meraviglia.

Qui inizia il problema: per consentire anche la modifica manuale del valore (tramite una Dialog) ho aggiunto l'evento onClickListener alla TextView che contiene il valore da modificare. Però se l'utente vuole fare lo swipe e inizia dal punto in cui si trova la TextView non viene più riconosciuta la gesture della view principale.

Come posso informare la TextView che in caso di tap e swipe deve lasciar fare il lavoro alla view principale?

Grazie in anticipo,
Marco
« Ultima modifica: 22 Agosto 2016, 18:13:56 CEST da capitancooker »
Se sbaglio, correggetemi.

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:onTouchListener e onClickListener
« Risposta #1 il: 23 Agosto 2016, 12:08:24 CEST »
+1
Prova ad usare onTouchListener invece di onClickListener nella TextView.

Se il touchListener della TW intercetta un click (down ed up entro un gap minimo), gestisci l'evento come tale e fai restituire true (=evento consumato), altrimenti fai restituire false e la gestione passerà al touchListener della view principale.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline capitancooker

  • Utente junior
  • **
  • Post: 56
  • Marco
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5, Asus Zenpad S 8.0
  • Sistema operativo:
    Mac OSX El Capitan
Re:onTouchListener e onClickListener
« Risposta #2 il: 26 Agosto 2016, 19:11:57 CEST »
+1
Allora, ho provato come mi hai suggerito, non sono però riuscito a far funzionare il touchlistener come volevo. Ho comunque risolto applicando la tua risposta ad un doppio tap, che tutto sommato mi va anche bene.
Riporto qui brevemente il codice nel caso possa servire a qualcuno:

Codice (Java): [Seleziona]
 myTextView.setOnTouchListener(
                new View.OnTouchListener() {

                    private long gap;

                    public boolean onTouch(View view, MotionEvent event) {

                        if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                            if (gap > 0) {
                                // Il secondo tap deve avvenire entro mezzo secondo
                                if ((System.currentTimeMillis() - gap) < 500) {

                                    // Qui ci metto il codice da eseguire con il doppio tap...

                                    gap = 0;
                                    return true;
                                }
                            }
                        }
                        gap = System.currentTimeMillis();
                        return false;
                    }
                });

Grazie mille,
Marco
Se sbaglio, correggetemi.

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:onTouchListener e onClickListener
« Risposta #3 il: 27 Agosto 2016, 21:03:50 CEST »
0
Per gestire il click devi:
- Intercettare MotionEvent.ACTION_DOWN, dove memorizzi coordinate del tocco e timestamp. Restituisci false.
- Intercettare MotionEvent.ACTION_UP, dove controlli che il tempo non sia maggiore ad un lasso stabilito (altrimenti è longclick) e che le coordinate non siano variate oltre un intervallo stabilito (altrimenti è swipe/slide). Se è vero gestisci il click, e restituisci true

Per l'intervallo temporale e quello posizionale non so se esistono dei valori forniti dal SO, eventualmente fammi sapere che faccio una ricerca nei sorgenti di Android
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.