2010-11-16 23 views
18

) में देरी कैसे सेट करें मैं एक मेमोरी गेम बनाने की प्रक्रिया में हूं। मेरी समस्या यह है कि जब भी मैं दूसरी बार क्लिक करता हूं, तो मैं टॉगल बटन भी नहीं देख सकता। स्पष्ट होने के लिए - पहले टॉगलबटन को टॉगल करें पर क्लिक करें, इसलिए मैं उस नंबर को देख सकता हूं, एक अलग टॉगलबटन पर दूसरा क्लिक टॉगल करने के लिए लगाया गया है, मुझे नंबर दिखाएं और फिर नंबरों को सेट करने के लिए आगे बढ़ें यदि संख्याएं हैं वही, या अगर वे अलग हैं तो उन्हें फिर से उलट दें।एंड्रॉइड ऑनक्लिक फ़ंक्शन

नीचे कोड है जो मैं अपने ऑनक्लिक फ़ंक्शन के रूप में उपयोग करता हूं, मैं किसी अन्य प्रकार की नींद या देरी समारोह को दूसरे "ब्लॉक" में कहीं भी डालने के बारे में सोच रहा हूं - (अगर (klikniecia == 2))।

इस विषय पर किसी भी मदद की सराहना की जाएगी।

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

+2

कोड में चर के पॉलिश नामों का उपयोग करना मेरे लिए आसान है, और जब मैं इसे लिखता हूं तो मैं इसे किसी और के बारे में नहीं सोचता ;-) हालांकि भविष्य में अधिक जटिल परियोजनाओं में मैं अंग्रेजी का उपयोग करने पर विचार कर सकता हूं :-) – Piotrgo

उत्तर

51

ऑनक्लिक में सोने के बजाय, आप एक हैंडलर (संबंधित रननेबल के साथ) में देरी संदेश पोस्ट कर सकते हैं और इसे यूआई अपडेट कर सकते हैं। जाहिर है अपने अनुप्रयोग के डिजाइन में इस फिट और यह काम करते हैं, लेकिन मूल विचार यह है:

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

फिर onClick से आप एक हैंडलर के लिए एक देरी संदेश पोस्ट, यह निर्दिष्ट है कि निष्पादित किया जाना है runnable।

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

कैसे जटिल अपने खेल पर निर्भर करता है, यह वास्तव में नहीं हो सकता है कि आप क्या चाहते हैं, लेकिन यह आप एक शुरुआत देना चाहिए।

+0

यदि मैं यह सही हो गया है, अवधारणा यह है कि मुझे उस कोड के उस हिस्से को लपेटना चाहिए जिसे मैं चलाने योग्य के अंदर देरी करना चाहता हूं, और फिर उसे ऑनक्लिक से देरी के साथ संदर्भित करना चाहिए। यह एक अच्छा विचार प्रतीत होता है। मैं आज कोशिश करूँगा, लेकिन मुझे लगता है कि यह काम करने जा रहा है :-) – Piotrgo

+0

धन्यवाद! यह एक सम्मोहन की तरह काम करता है! :-) – Piotrgo

+0

बढ़िया! मुझे खुशी है कि यह आपके लिए काम करता है। –

2

आप (डिफ़ॉल्ट अपने सभी कोड यूआई धागा में चलता है) के द्वारा यूआई सूत्र में कभी नहीं सो जाना चाहिए - यह केवल यूआई फ्रीज कर देगा, कुछ परिवर्तन या खत्म नहीं। मैं और सुझाव नहीं दे सकता क्योंकि मुझे कोड तर्क समझ में नहीं आता है।

2

यूआई थ्रेड में सो जाओ। आपको एक और थ्रेड चाहिए जो आपके यूआई थ्रेड से "जागृत और प्रतीक्षा करें" संदेश की तलाश करेगा। वह दूसरा थ्रेड सामान्य नींद कॉल के बाद आपकी छुपा कर सकता है। अगली बार जब आप किसी चीज को छिपाने की ज़रूरत होती है, तो उसे थ्रेड को चारों ओर रख सकते हैं, या इसे मार सकते हैं और हर बार आपको एक और देरी की आवश्यकता होती है।

मेरा मानना ​​है कि कुछ "पोस्टफू" फ़ंक्शन हैं जो इस संदर्भ में उपयोगी हो सकते हैं (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); 


    } 
}); 
संबंधित मुद्दे