web-dev-qa-db-fra.com

Comment définir le délai dans Android fonction onClick

) Je suis en train de créer un jeu de mémoire. Mon problème est que chaque fois que je clique pour la deuxième fois, je ne vois même pas le bouton basculé. Pour être clair - premier clic bascule le bouton bascule, donc je peux voir le nombre qu'il contient, le deuxième clic sur un autre bouton bascule est supposé le basculer, montrez-moi le nombre et ensuite passez à l'un ou l'autre définir un score +1 si les nombres sont les ou inversez-les s'ils sont différents.

Ci-dessous est le code que j'utilise comme ma fonction onClick, j'ai pensé à mettre une sorte de fonction de veille ou de retard quelque part dans le deuxième "bloc if" - (if (klikniecia == 2)).

Toute aide sur ce sujet serait appréciée.

public void onClick(View view) {
for (int i = 0; i < karta.length; i++){
    if (view == karta[i]){
        karta[i].setEnabled(false);
        klikniecia++;
        if (klikniecia == 1){
            kartaID[0]=i;
            kartaWartosc[0]=listaKart.get(i);

        }
        if (klikniecia == 2){
            kartaID[1]=i;
            kartaWartosc[1]=listaKart.get(i);

            //i think, about setting a delay here, so i can see both of the cards, regardles if the're the same or not before reverting them.

            if (czyPara()){
                karta[kartaID[0]].setEnabled(false);
                karta[kartaID[1]].setEnabled(false);
                klikniecia=0;
            }
            else{

                karta[kartaID[0]].setEnabled(true);
                karta[kartaID[0]].toggle();
                karta[kartaID[1]].setEnabled(true);
                karta[kartaID[1]].toggle();
                klikniecia=0;

            }
        }

    }

}

}

19
Piotrgo

Au lieu de dormir dans le onclick, vous pouvez poster un message différé à un gestionnaire (avec runnable associé) et lui demander de mettre à jour l'interface utilisateur. Évidemment, intégrez cela dans la conception de votre application et faites-la fonctionner, mais l'idée de base est la suivante:

//Here's a runnable/handler combo
private Runnable mMyRunnable = new Runnable()
{
    @Override
    public void run()
    {
       //Change state here
    }
 };

Ensuite, à partir d'onClick, vous envoyez un message différé à un gestionnaire, spécifiant le runnable à exécuter.

Handler myHandler = new Handler();
myHandler.postDelayed(mMyRunnable, 1000);//Message will be delivered in 1 second.

Selon la complexité de votre jeu, ce n'est peut-être pas exactement ce que vous voulez, mais cela devrait vous donner un début.

51
Ryan Reeves

Travailler correctement:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);
34
Ali Mohammadi

Vous ne devriez jamais dormir dans le thread d'interface utilisateur (par défaut, tout votre code s'exécute dans le thread d'interface utilisateur) - cela ne fera que geler l'interface utilisateur, pas laisser quelque chose changer ou terminer. Je ne peux pas suggérer plus car je ne comprends pas la logique du code.

2
Andrey Novikov

Ne pas dormir dans le thread d'interface utilisateur. Vous avez besoin d'un autre thread qui recherchera un message "réveillez-vous et attendez" à partir de votre thread d'interface utilisateur. Ce deuxième fil pourrait alors vous cacher après un appel de sommeil normal. Vous pouvez ensuite conserver le fil pour la prochaine fois que vous devez cacher quelque chose, ou le tuer et en créer un nouveau chaque fois que vous avez besoin d'un autre délai.

Je crois qu'il existe des fonctions "postFoo" qui pourraient être utiles dans ce contexte (déclenchant des événements d'interface utilisateur en dehors du thread d'interface utilisateur).

2
Mark Storer
b.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        final ProgressDialog myPd_ring=ProgressDialog.show(MainActivity.this, "confident checker", "calculating please wait..", true);
        myPd_ring.setCancelable(true);
        new Thread(new Runnable() {  
              public void run() {
                    // TODO Auto-generated method stub


                    try
                    {
                          Thread.sleep(5000);


                    }
                    catch(Exception e){}
                    b.dismiss();
              }
        }).start();


        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
          public void run() {
              Toast.makeText(getApplicationContext(), "today your confident level is 90% ",
                        Toast.LENGTH_LONG).show();

          }
        }, 5000);


    }
});
1
Anand Mohan