2010-11-16 16 views
18

) Sono in un processo di creazione di un gioco di memoria. Il mio problema è che ogni volta che clicco per la seconda volta, non riesco nemmeno a vedere il pulsante di commutazione. Per essere chiari, il primo clic attiva o disattiva il pulsante di selezione, quindi posso vedere il numero che contiene, il secondo clic su un pulsante di attivazione diverso è impostato per attivarlo, mostrarmi il numero e quindi procedere a impostare un punteggio +1 se i numeri sono i stesso, o invertirli di nuovo se sono diversi.Come impostare il ritardo nella funzione Android onClick

Di seguito è riportato il codice che utilizzo come funzione onClick, ho pensato di inserire una sorta di funzione sleep o delay somwhere nel secondo "if block" - (if (klikniecia == 2)).

Qualsiasi aiuto su questo argomento sarebbe apprezzato.

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; 

      } 
     } 

    } 

} 

}

+12

Perché le persone usano ancora i nomi non inglesi nel loro codice? Ciò rende la comprensione/lettura davvero difficile per le persone che non parlano una lingua. – ThiefMaster

+2

È più facile per me usare nomi lucidati di variabili nel codice, e quando lo scrivo non penso a nessun altro che lo guardi ;-) Anche se in progetti più complessi in futuro potrei considerare l'uso di :-) – Piotrgo

risposta

51

Invece di dormire nel onclick, è possibile inviare un messaggio in ritardo a un gestore (con eseguibile associato) e aggiornare l'interfaccia utente. Ovviamente inserire questo nel design della vostra app e farlo funzionare, ma l'idea di base è questa:

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

Poi da onclick si inserisce un messaggio in ritardo a un gestore, specificando che eseguibile da eseguire.

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

A seconda di quanto sia complicato il gioco, questo potrebbe non essere esattamente quello che vuoi, ma dovrebbe darti un inizio.

+0

ho capito bene, il concetto è che dovrei avvolgere quella parte del codice che voglio rimandare all'interno del runnable, e quindi riferirmi con un ritardo da onclick. Questa sembra essere una buona idea. Ci proverò oggi, ma penso che funzionerà :-) – Piotrgo

+0

Grazie! Esso funziona magicamente! :-) – Piotrgo

+0

Grande! Sono contento che abbia funzionato per te. –

2

hai mai dovrebbe dormire nel thread UI (di default tutto il codice viene eseguito in thread UI) - sarà solo fare UI gelo, non lasciare che il cambiamento di qualcosa o finitura. Non posso suggerire di più perché non capisco la logica del codice.

2

Do non dormire nel thread dell'interfaccia utente. È necessario un altro thread che cercherà un messaggio "sveglia e attendi" dal thread dell'interfaccia utente. Quel secondo filo potrebbe quindi nascondersi dopo una normale chiamata a riposo. È quindi possibile mantenere il thread per la prossima volta che è necessario nascondere qualcosa, o ucciderlo e montarne uno nuovo ogni volta che è necessario un altro ritardo.

Credo ci siano alcune funzioni "postFoo" che potrebbero essere utili in questo contesto (l'attivazione di eventi UI dall'esterno del thread dell'interfaccia utente).

31

correttamente lavoro:

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    //Do something after 100ms 
    } 
}, 100); 
1
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); 


    } 
}); 
Problemi correlati