Android: Verhindern Sie mehrere onClick-Ereignisse auf einer Schaltfläche (die deaktiviert wurde)

Eine Schaltfläche löst eine Aktion aus, die nur einmal aufgerufen werden soll. Die Schaltfläche ist deaktiviert und im OnClick-Handler ausgeblendet, bevor die Aktion ausgeführt wird:

someButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { someButton.setEnabled(false); someButton.setClickable(false); someButton.setVisibility(View.GONE); performTaskOnce(); } }); private void performTaskOnce() { Log.i("myapp", "Performing task"); //Do something nontrivial that takes a few ms (like changing the view hierarchy) } 

Auch wenn die Schaltfläche sofort deaktiviert ist, ist es trotzdem möglich, mehrere "onClick" -Ereignisse auszulösen, indem sie mehrmals sehr schnell tippen. ( performTaskOnce wird mehrmals aufgerufen). Es scheint, dass die onClick-Ereignisse in die Warteschlange gestellt werden, bevor die Schaltfläche tatsächlich deaktiviert ist.

Ich könnte das Problem beheben, indem ich in jedem einzelnen onClick-Handle überprüfe, ob die entsprechende Schaltfläche bereits deaktiviert ist, aber das scheint wie ein Hack. Gibt es einen besseren Weg, um dieses Problem zu vermeiden?

Das Problem tritt auf Android 2.3.6, kann ich nicht reproduzieren es auf Android 4.0.3. Aber angesichts der Seltenheit von 4.x-Geräten ist es nicht möglich, ältere Geräte auszuschließen.

  • Schnellste Weg, um Benutzereingaben in Android zu erhalten
  • Aktivitätslebenszyklus - Benachrichtigung, dass das Layout vollständig ist
  • ListPopupWindow nicht befolgen WRAP_CONTENT width spec
  • Android - Erstellen von Listenansicht mit Floating-Headern
  • Facebook SDK v4 LoginButton ignoriert XML-Anpassungen
  • Android: eine neuartige GUI-Frage - wie man ViewGroup deklariert, ohne Layout-XML-Datei?
  • Padding hat keinen Einfluss auf <shape> in einem XML-Layout
  • Animierte Aktivität, die nicht Teil Ihrer App ist
  • 4 Solutions collect form web for “Android: Verhindern Sie mehrere onClick-Ereignisse auf einer Schaltfläche (die deaktiviert wurde)”

    Sie können eine Boolesche Variable auf true setzen, wenn die Schaltfläche angeklickt wird, und legen Sie sie auf false fest, wenn Sie fertig sind, um den Klick zu bearbeiten.

    Auf diese Weise können Sie mehrere Klicks ignorieren und nicht die Schaltfläche deaktivieren, um eventuell ein lästiges Flackern des Knopfes zu vermeiden.

     boolean processClick=true; someButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(processClick) { someButton.setEnabled(false); someButton.setClickable(false); someButton.setVisibility(View.GONE); performTaskOnce(); } processClick=false; } }); private void performTaskOnce() { Log.i("myapp", "Performing task"); //Do something nontrivial that takes a few ms (like changing the view hierarchy) } 

    Im Interesse der Erhaltung von TROCKEN :

     // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Override public final void onClick(View v) { if (!hasClicked) { onClicked(v); hasClicked = true; } } public abstract void onClicked(View v); } // Usage example public class MyActivity extends Activity { private View myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Override public void onClicked(View v) { // do clicky stuff } }); } } 

    Biss spät, aber das könnte für jemanden von Nutzen sein. In meinem Fall rufe ich noch eine andere Tätigkeit an;

    Deklariere einen Booleschen;

     boolean clickable; 

    Im Klick-Listener;

     if(clickable){ // Launch other activity clickable = false; } 

    Aktivieren, wenn onResume aufgerufen wird.

     @Override public void onResume() { Log.e(TAG, "onResume"); super.onResume(); clickable = true; } 

    Erklären Sie eine Variable und verwenden Sie es als

      boolean boo = false; someButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(boo==false){ someButton.setEnabled(false); someButton.setClickable(false); someButton.setVisibility(View.GONE); boo = true; } } }); 

    Dadurch verhindern Sie mehrere Klicks auf Ihre Schaltfläche

    Hoffe es hilft

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.