2010-11-16 77 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); 


    } 
});