2010-11-16 9 views
18

) Estoy en un proceso de creación de un juego de memoria. Mi problema es que cada vez que hago clic por segunda vez, ni siquiera puedo ver el botón girado. Para ser claros, primero haga clic en el botón para alternar, para que pueda ver el número que contiene, el segundo clic en un botón para alternar diferente es para alternar, muéstreme el número y luego proceda a establecer un puntaje +1 si los números son el lo mismo, o invertirlos nuevamente si son diferentes.Cómo establecer el retraso en la función onClick de Android

A continuación se muestra el código que uso como función onClick, he estado pensando en poner algún tipo de función sleep o delay en algún lugar en el segundo "if block" - (if (klikniecia == 2)).

Cualquier ayuda sobre este tema sería apreciada.

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

¿Por qué la gente todavía utiliza nombres no ingleses en su código? Eso hace que la comprensión/lectura sea realmente difícil para las personas que no hablan $ lenguaje. – ThiefMaster

+2

Es más fácil para mí usar los nombres polacos de las variables en el código, y cuando lo escribo no pienso en nadie más que lo mire ;-) Aunque en proyectos futuros más complejos podría considerar el uso del inglés :-) – Piotrgo

Respuesta

51

En lugar de permanecer inactivo en el onclick, puede publicar un mensaje retrasado en un controlador (con el ejecutable asociado) y hacer que actualice la interfaz de usuario. Obviamente, esto encajar en el diseño de su aplicación y hacer que funcione, pero la idea básica es la siguiente:

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

Luego de onClick publica un mensaje retrasado a un controlador, que especifica que ejecutable a ejecutar.

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

Dependiendo de lo complicado que sea su juego, puede que no sea exactamente lo que quiere, pero debería darle un comienzo.

+0

Si Entendido, el concepto es que debo envolver esa parte del código que quiero que se demore dentro del ejecutable, y luego referirme a él con un retraso de onclick. Esta parece ser una buena idea. Voy a intentar esto hoy, pero creo que va a funcionar :-) – Piotrgo

+0

¡Gracias! ¡Funciona a las mil maravillas! :-) – Piotrgo

+0

¡Genial! Me alegra que haya funcionado para ti. –

2

Nunca se debe dormir en hilo de interfaz de usuario (por defecto todo el código se ejecuta en hilo de interfaz de usuario) - que sólo hará congelación de la interfaz de usuario, no dejar que algo cambie o acabado. No puedo sugerir más porque no entiendo la lógica del código.

2

Do no dormir en el hilo de la interfaz de usuario. Necesita otro hilo que busque un mensaje de "despertar y esperar" de su subproceso de interfaz de usuario. Ese segundo hilo podría ocultarse después de una llamada de sueño normal. Luego puede mantener el hilo la próxima vez que necesite ocultar algo, o matarlo y encender uno nuevo cada vez que necesite otro retraso.

Creo que hay algunas funciones "postFoo" que pueden ser útiles en este contexto (desencadenar eventos de IU desde fuera del hilo de IU).

31

correctamente obra:

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); 


    } 
}); 
Cuestiones relacionadas