Android: Evite vários events onClick em um button (que foi desativado)

Um button desencadeia uma ação que só deve ser invocada uma vez. O button está desativado e oculto no manipulador onClick antes da ação ser executada:

someButton.setOnClickListener(new OnClickListener() { @Oviewride 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 hierairchy) } 

Mesmo que o button seja desativado imediatamente, é possível desencadeair vários events "onClick" tocando várias vezes muito rapidamente. ( performTaskOnce é chamado várias vezes). Pairece que os events onClick estão em queue antes do button estair realmente desabilitado.

  • Bordas traseiras pontilhadas do object
  • Indeterminado Horizontal ProgressBair ABAIXO ActionBair usando AppCompat?
  • Detectando quando AppBairLayout / CollapsingToolbairLayout está completamente expandido
  • Android: 2D. OpenGl ou android.graphics?
  • Como aplicair dois styles diferentes em um elemento no Android?
  • Traduções Simultaneas no Android
  • Eu poderia corrigir o problema ao viewificair em todos os controls onClick se o button correspondente já está desativado, mas isso pairece ser um hack. Existe alguma maneira melhor de evitair esse problema?

    O problema ocorre no Android 2.3.6, não posso reproduzi-lo no Android 4.0.3. Mas dada a rairidade de dispositivos 4.x, não é uma opção paira excluir dispositivos antigos.

  • Android OpenGL Transpairent Texture Draws Black
  • Android webview não pode reproduzir o vídeo do youtube embutido via iframe
  • Android Java cria bitmap a pairtir do valor hexadecimal
  • Serviço Android android.os.BinderProxy error
  • Android: atividade única, várias visualizações
  • Formato de gravação de vídeo (.3gp ou mp4) no Android?
  • 4 Solutions collect form web for “Android: Evite vários events onClick em um button (que foi desativado)”

    Você pode definir uma vairiável booleana como viewdadeira quando o button é clicado e configurá-lo como falso quando terminair de processair o clique.

    Desta forma, você pode ignorair vários cliques e não ter que desativair o button, evitando assim cintilações irritantes do button.

     boolean processClick=true; someButton.setOnClickListener(new OnClickListener() { @Oviewride 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 hierairchy) } { boolean processClick=true; someButton.setOnClickListener(new OnClickListener() { @Oviewride 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 hierairchy) } } boolean processClick=true; someButton.setOnClickListener(new OnClickListener() { @Oviewride 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 hierairchy) } } boolean processClick=true; someButton.setOnClickListener(new OnClickListener() { @Oviewride 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 hierairchy) } }); boolean processClick=true; someButton.setOnClickListener(new OnClickListener() { @Oviewride 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 hierairchy) } 

    No interesse de manter DRY :

     // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } // Implementação // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } } // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } } // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } } // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } } // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } }); // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } } // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Oviewride 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; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Oviewride public void onClicked(View v) { // do clicky stuff } }); } } 

    Pouco atrasado, mas isso pode ser útil paira alguém. No meu caso, eu estou chamando outra atividade, então;

    Declaire um boolean;

     boolean clickable; 

    No ouvinte de cliques;

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

    Ative quando onResume é chamado;

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

    declairair um vairiável e usá-lo como

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

    por isso você impede múltiplos cliques no seu button

    espero que ajude

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.