2013-05-21 9 views
8

Mockup della mia richiesta:Come risolvere il doppio tocco su Button Issue in Android?

Double Tap Mockup


Problema:

Quando click sul button1 semplicemente chiamare intenti di ActivitySecond

Tuttavia, a doppio tocco apri due volte ActivitySecond.


COME RISOLVERE.

PER FAVORE SE QUALSIASI SOLUZIONE POI CONDIVIDERE.

Grazie.

+2

sincronizzare onClick e disabilitare il pulsante con 'setEnabled (false)' al primo clic e 'setEnabled (true)' onResume –

+0

La risposta è stata postata qui [prevenire doppio tocco sul pulsante android] (https: // stackoverflow .com/questions/11290610/how-to-prevent-double-code-running-by-click-two-fast-to-a-button-in-android/45917595 # 45917595) –

risposta

3

È possibile impostare launchMode di ActivitySecond per singleTop

<activity android:name=".ActivitySecond" 
      android:launchMode="singleTop" 
      > 
      ... 
</activity> 
+0

Grazie. Lo risolvo con il tuo codice. :) – Darshak

+4

Non la migliore soluzione IMO, in quanto porta a una cattiva esperienza utente. La seconda attività inizia ancora due volte (cosa che viene notata dall'utente a meno che l'animazione non sia disabilitata ed è subottimale in termini di consumo di risorse). Inoltre, l'impostazione di questo flag potrebbe compromettere la navigazione. –

7

Questo si chiama debouncing- suo un problema classico in hardware e software. Ci sono un paio di trucchi che puoi fare, ma si riducono tutti a disabilitare temporaneamente il pulsante e riattivarlo in seguito. Questo può essere fatto via timer (ottenere il tempo in cui cliccano su di esso, salvarlo, e se fanno di nuovo clic entro 100ms ignorano il secondo clic). Un altro modo sarebbe disabilitare il pulsante dopo onClick e riattivarlo quando la nuova attività termina tramite onActivityResult. Oppure c'è una dozzina di altri modi, scegli il più facile per te.

2
btn.setOnclickListener(new View.onClickListener(){ 

      public void onClick(View v) { 
       btn.setEnabled(false); 

      } 
    }); 

devi rendere setEnabled (false) in onlclick evento.

+0

Non voglio abilitare/disabilitare, il suo lungo processo per me perché ho più di 200 layout nella mia applicazione. Il tuo codice è anche vero. – Darshak

+0

sì, grazie per la risposta. – Darshak

8

Come Gabe Séchan triste:

Questo può essere fatto tramite timer (ottenere il tempo fanno clic su di esso, salvarlo, e se si clicca di nuovo nel dire 100ms ignorano il secondo click)

Ecco un'implementazione che ho usato nel mio progetto:

public abstract class OnOneClickListener implements View.OnClickListener { 
    private static final long MIN_CLICK_INTERVAL = 1000; //in millis 
    private long lastClickTime = 0; 

    @Override 
    public final void onClick(View v) { 
     long currentTime = SystemClock.elapsedRealtime(); 
     if (currentTime - lastClickTime > MIN_CLICK_INTERVAL) { 
      lastClickTime = currentTime; 
      onOneClick(v); 
     } 
    } 

    public abstract void onOneClick(View v); 
} 

Basta usare OnOneClickListener invece di OnClickListener ed eseguire yo codice ur nel metodo onOneClick().

La soluzione con pulsante di disabilitazione in onClick() non funzionerà. Due clic su un pulsante possono essere programmati per l'esecuzione anche prima che il tuo primo onClick() esegua e disattivi il pulsante.

+0

puoi risolvere la mia query simile. Sto cercando di alzare il dito quando il pulsante di accensione viene premuto due volte –

0

Quando uso il selettore drawable in Pulsanti e impostare

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

svolge l'evento onClick() sul doppio clic. Ho trovato accidentalmente di lavorare su Android emulator api livello 10, Android 2.3.3 Non testato sul dispositivo reale. Ecco il codice completo.

   <Button 
       android:layout_width="50dp" 
       android:layout_height="wrap_content" 
       android:text="Discover" 
       android:id="@+id/Button1" 
       android:layout_weight=".5" 
       android:layout_margin="0dp" 
       android:background="@drawable/btn_nearby" 
       android:contentDescription="gjhfjhkjhgkvkjh" 
       android:drawableLeft="@drawable/ic_follow" 
       android:paddingLeft="20dp" 
       android:paddingRight="0dp" 
       android:drawablePadding="-10dp" 
       android:textSize="16sp" 
       android:paddingTop="2.5dp" 
       android:paddingBottom="2.5dp" 
       android:clickable="true" 
       android:focusable="true" 
       android:focusableInTouchMode="true"/> 

e il codice Java

@Override 
    public void onClick(View view) { 
     switch(view.getId()) { 

      case R.id.Button1: 
       onButton1Click(); 
       break; 

      case R.id.Button2: 
       onButton2Click(); 
       break; 

      } 
    } 
0

mi limiterò a presentare una terza soluzione per questo. L'ho risolto aggiungendo un booleano che è stato usato per verificare se l'attività (che inizia il pulsante) è stata avviata o meno.