104 votes

Comment empêcher l'activité de se charger deux fois en appuyant sur le bouton

Ce que j'essaie de comprendre est d'empêcher l'activité de chargement deux fois si j'appuie sur le bouton deux fois.

J'ai une activité qui charge sur le clic d'un bouton, dire

 myButton.setOnClickListener(new View.OnClickListener() {
      public void onClick(View view) {
       //Load another activity
    }
});

Maintenant, en raison de l'activité de chargement a quelque chose à faire avec le service web et d'autres opérations, il faut un peu de temps à se charger. Bien sûr, j'ai un chargement de vue pour cela. Mais avant cela, si j'appuie sur le bouton deux fois, je peux voir l'activité chargé à deux reprises.

Faire un sais comment faire pour éviter cela?

168voto

Awais Tariq Points 2866

Ajouter ceci à votre Activity définition en Androidmanifest.xml ...

 android:launchMode = "singleInstance"
 

76voto

wannik Points 3026

Dans l'écouteur d'événements du bouton, désactivez le bouton et affichez une autre activité.

     Button b = (Button) view;
    b.setEnabled(false);

    Intent i = new Intent(this, AnotherActitivty.class);
    startActivity(i);
 

Remplacez onResume() pour réactiver le bouton.

 @Override
    protected void onResume() {
        super.onResume();

        Button button1 = (Button) findViewById(R.id.button1);
        button1.setEnabled(true);
    }
 

42voto

Carlos EduardoL Points 34

Vous pouvez utiliser les indicateurs d'intention comme celui-ci.

 Intent intent = new Intent(Class.class);    
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
activity.startActivity(intent);
 

Cela fera qu'une seule activité peut être ouverte en haut de la pile d'historique;

4voto

servoper Points 108

Disons @wannik est juste, mais si nous avons plus de 1 bouton d'appel, une même action, l'écouteur, et j'ai cliquer sur deux boutons à la fois presque en même temps avant de commencer l'activité suivante...

Ainsi il est bon si vous avez le champ private boolean mIsClicked = false; et dans l'écouteur:

if(!mIsClicked)
{
    mIsClicked = true;
    Intent i = new Intent(this, AnotherActitivty.class);
    startActivity(i);
}

Et onResume() nous avons besoin de revenir à l'état:

@Override
protected void onResume() {
    super.onResume();

    mIsClicked = false;
}

Quelle est la deifference entre mon et @wannik de réponse?

Si vous définissez enabled à false dans le port d'écoute de l'appel de la vue d'un autre bouton en utilisant le même port d'écoute sera toujours activé. Donc, pour être sûr que l'auditeur action n'est pas appelé deux fois, vous avez besoin d'avoir quelque chose de global qui désactive tous les appels de l'auditeur(tant pis si c'est une nouvelle instance ou pas)

Quelle est la différence entre ma réponse et les autres?

Ils sont la pensée dans le droit chemin, mais ils ne sont pas la pensée de l'avenir de retour à la même instance de l'appel d'activité :)

3voto

doraemon Points 4099

J'espère que cela t'aides:

  protected static final int DELAY_TIME = 100;

// to prevent double click issue, disable button after click and enable it after 100ms
protected Handler mClickHandler = new Handler() {

    public void handleMessage(Message msg) {

        findViewById(msg.what).setClickable(true);
        super.handleMessage(msg);
    }
};

@Override
public void onClick(View v) {
    int id = v.getId();
    v.setClickable(false);
    mClickHandler.sendEmptyMessageDelayed(id, DELAY_TIME);
    // startActivity()
}`
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X