2010-11-16 36 views
18

) 我正在创建一个记忆游戏的过程。我的问题是,每当我第二次点击,我什至不能看到切换按钮。要清楚 - 首先点击切换togglebutton,所以我可以看到它保存的数字,第二次点击一个不同的togglebutton是为了切换它,给我看数字,然后继续设置分数+1,如果数字是相同,或者如果它们不同,则将它们反转回去。下面是我用作onClick函数的代码,我一直在考虑在第二个“if block”中放入某种睡眠或延迟函数somwhere - (if(klikniecia == 2))。如何在Android onClick函数中设置延迟

任何有关这个主题的帮助将不胜感激。

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

为什么人们仍然在他们的代码中使用非英语的名字呢?这使得对不懂语言的人来说,理解/阅读真的很难。 – ThiefMaster 2010-11-16 23:23:11

+2

在代码中使用波兰语变量名更容易,当我编写代码时,我不会考虑其他任何人看它;-)虽然在未来更复杂的项目中,我可能会考虑使用英语:-) – Piotrgo 2010-11-17 09:46:30

回答

51

您可以将延迟的消息发布到处理程序(与关联的可运行)并将其更新到UI,而不是在onclick中休眠。显然符合这一到您的应用程序的设计,使其工作,但基本的思路是这样的:

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

然后从你的onClick发布延迟的消息处理程序,指定运行的执行。

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

根据你的游戏有多复杂,这可能不是你想要的,但它应该给你一个开始。

+0

如果我得到这个权利,这个概念是,我应该将我希望在可运行内部延迟的那部分代码包装起来,然后在onclick中延迟引用它。这似乎是一个好主意。我今天会尝试这个,但我认为它会起作用:-) – Piotrgo 2010-11-17 09:43:57

+0

谢谢!它像一个魅力! :-) – Piotrgo 2010-11-17 15:02:22

+0

太棒了!我很高兴它为你工作。 – 2010-11-17 17:15:05

2

你不应该睡在UI线程(默认情况下,所有的代码在UI线程中运行) - 只会使UI冻结,不能让一些变化或结束。我不能建议更多,因为我不懂代码逻辑。

2

不是睡在UI线程中。您需要另一个线程来查找UI线程中的“唤醒和等待”消息。然后,第二个线程可以在正常的睡眠呼叫后进行隐藏。然后,您可以保留线索,以便下次需要隐藏某些内容时,或者在每次需要再次延迟时杀死它并掀起新线程。

我相信有一些“postFoo”函数可能在此上下文中有用(从UI线程外触发UI事件)。

31

正常工作:

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


    } 
});