2011-08-25 11 views
5

Problema:Android :: OnTouchListener && OnClickListener questione combinazione descrizione

Ho un TextView su una RelativeLayout e voglio colorare di rosso quando l'utente tocca, e andare in un'altra pagina quando si fa clic su di esso. Quindi ho provato a impostare un OnClickListener per fare il clic e un MotionEvent.ACTION_DOWN per implementare la funzione touch() ma questa combinazione non funziona, perché OnTouchListener rende non funzionale (OnClickListener) (non so perché).

Sul forum di gente dice che siamo in grado di realizzare il OnClick dal OnTouch MotionEvent.ACTION_UP, ma questo può essere innescato dal mio layout TextView (la TextView andando essere cliccato se si preme e trascinare il dito da lui per liberare) e questo non è il comportamento desiderato perché voglio:
click = premi + rilascia sul TextView.

Qualcuno può darmi una soluzione per questo per favore?

risposta

3

Adel, è il problema con il primo clic o non si ottiene alcun clic?

C'è questo problema se si dispone di più layout cliccabile non si ottiene alcun evento di clic per il primo. Questo perché lo fa prima selezionato e poi ottieni l'evento click, prova il codice qui sotto.

private class CustomTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     TextView tv = (TextView) v.findViewById(R.id.single_line_text); 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      tv.setTextColor(COLOR_WHEN_PRESSED); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
      // Action of click goes here 
     } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
          // To handle release outside the layout region 
     } 
     return false; 
    } 
} 

Questo sta funzionando nella mia attuale implementazione se si imposta l'ascoltatore di tocco per il layout.

È inoltre necessario impostare sotto del formato

android:focusable="true" 
android:focusableInTouchMode="true" 
android:clickable="true" 

Speranza che aiuta !!!

MODIFICA: Inoltre, ci dovrebbe essere una bandierina sia in GIÙ che in SU. Impostalo in DOWN e verifica se è impostato su UP. Ciò eviterà un bug in cui l'utente potrebbe toccare qualsiasi punto dello schermo e quindi passare il mouse sulla tua vista testo e rilasciarlo.

+0

Grazie mille! Mi hai sicuramente aiutato. Il trucco per me è stato quello di impostare le tre proprietà che hai dichiarato ... – harsimranb

+0

Grazie per l'aiuto! Mi mancava l'androide: focusable = "true" nel mio TextView – Gatekeeper

21

è possibile chiamare View.performClick() quando action_up. Spero che sia d'aiuto.

your_txtView.setOnClickListener(new TextView.OnClickListener(){ 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){ 
      @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (MotionEvent.ACTION_DOWN == event.getAction()) { 

     } else if (MotionEvent.ACTION_UP == event.getAction()) { 
      v.performClick(); 
     } 

     return true; 
    } 
    }); 
+0

ho avuto lo stesso problema ... e v.performClick funziona magnificamente ... questa è la soluzione ... per favore accetta la risposta –

+0

+1, questo è quello che Stavo cercando. – tokudu

+0

Grazie, sven. Questo e spettacolare. – aNoviceGuy

2

Aveva lo stesso problema. Risolto il problema restituendo false da ACTION_MOVE. Ho litigato per alcune ore, provando varie cose, ma sembra che abbia continuato a ignorare questo piccolo problema ... E ora ha senso. Quando si restituisce true da onTouch, l'ulteriore elaborazione viene interrotta, in modo che OnClickListener non sia a conoscenza di movimenti e attivatori onClick anche dopo che il puntatore si è spostato all'esterno della visualizzazione.

+0

Per conto di @ bugs99 che non può aggiungere commenti a causa di una mancanza di reputazione: cambiando il 'return true' a' return false', è possibile eseguire l'azione 'onTouchListener()' e quindi passare l'evento touch al 'onClickListener()'.Con questo, non è necessario eseguire esplicitamente 'performClick()' – gturri

Problemi correlati