2010-05-09 12 views
35

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

यह मैं क्या मिल गया है:

btnSubmit.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
     (...) 
      ProgressDialog pd = new ProgressDialog(MyApp.this); 
      pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pd.setMessage("Working..."); 
      pd.setIndeterminate(true); 
      pd.setCancelable(false); 

      // now fetch the results 
      (...long time calculations here...) 

      // remove progress dialog 
      pd.dismiss(); 

मैं भी pd.show(); जोड़ने की कोशिश की है और new ProgressDialog में पैरामीटर सब पर कुछ भी नहीं है, जिसके परिणामस्वरूप के साथ चारों ओर गड़बड़ (त्रुटियों, सिवाय इसके कि चुने हुए पैरामीटर काम नहीं करेगा), अर्थ: प्रोग्रेसडिअलॉग कभी दिखाई नहीं देगा। ऐप बस चल रहा है जैसे कि मैंने संवाद कभी नहीं जोड़ा।

मुझे नहीं पता कि मैं सही जगह पर संवाद बना रहा हूं, मैंने इसे थोड़ा सा स्थानांतरित कर दिया लेकिन वह भी मदद नहीं करता था। शायद मैं गलत संदर्भ में हूँ? उपरोक्त कोड MyApp में private ViewGroup _createInputForm() के अंदर है।

किसी भी संकेत की सराहना की है,

उत्तर

39

इससे पहले कि आप लंबे समय से गणना शुरू होता है pd.show कॉल करनी होगी और फिर गणना एक अलग थ्रेड में चलाने के लिए है। जैसे ही यह धागा समाप्त हो जाता है, आपको prgoress संवाद को बंद करने के लिए pd.dismiss() को कॉल करना होगा।

यहाँ आपको एक उदाहरण देख सकते हैं:

progressdialog बनाई गई है और प्रदर्शित होता है और एक धागा एक भारी गणना चलाने के लिए कहा जाता है: धागा

@Override 
    public void onClick(View v) { 
     pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false); 
     Search search = new Search( ... ); 
     SearchThread searchThread = new SearchThread(search); 
     searchThread.start(); 
    } 

और यहाँ:

private class SearchThread extends Thread { 

     private Search search; 

     public SearchThread(Search search) { 
      this.search = search; 
     } 

     @Override 
     public void run() {   
      search.search(); 
      handler.sendEmptyMessage(0); 
     } 

     private Handler handler = new Handler() { 

      @Override 
      public void handleMessage(Message msg) { 
       displaySearchResults(search); 
       pd.dismiss(); 
      } 
     }; 
    } 
+0

मैंने इसे पूरा करने के लिए अपने ऐप का पुनर्निर्माण किया है :) मैंने जो ट्यूटोरियल पढ़ा है, वह किसी अन्य धागे के बिना संभव था, लेकिन आप कभी भी सीखना बंद नहीं करते थे। मैं पूरी तरह से नहीं कर रहा हूं: अब प्रोग्रेसडियलोग यह नहीं दिखाता है कि इसे कहां करना चाहिए (कम से कम यह दिखाता है!), लेकिन परिणाम आने से कुछ ही समय पहले ही "चमक" आता है, लेकिन अब मुझे लगता है कि मैं बाकी को अपने आप कर सकता हूं;) आपकी सहायता के लिए धन्यवाद! – Select0r

+2

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

+2

हम पीडी = नई प्रोग्रेसडिअलॉग (यह) का उपयोग क्यों नहीं करते हैं; pd.show() ;? – Emerald214

24

मैं आपको इसके लिए एक समाधान दे रहा हूं, इसे आजमाएं .... पहले क्रिएट() से पहले गतिविधि में प्रगति संवाद को परिभाषित करें तरीका।

निजी प्रगतिDialog प्रगतिDialog;

अब ऑनक्रेट विधि में आपके पास कोई भी बटन क्लिक हो सकता है जिस पर आप किसी भी क्रिया पर सक्रियण को बदल देंगे। बस प्रोग्रेस बार सेट करें।

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading..."); 

अब प्रदर्शित करें और छिपाने के लिए

new Thread() 
{ 
    public void run() 
    { 

    try 
     { 
     sleep(1500); 

    // do the background process or any work that takes time to see progreaa dialog 

     } 
    catch (Exception e) 
    { 
     Log.e("tag",e.getMessage()); 
    } 
// dismiss the progressdialog 
    progressDialog.dismiss(); 
} 
}.start(); 

यही सब Progressbar Hamndle को धागा का प्रयोग करें!

+0

इसकी प्रगति पूरी तरह से प्रगतिशील है। लेकिन मेरा संदर्भ थोड़ा अलग है। जब मैं एक एप्लिकेशन से दूसरे में स्विच करता हूं और ब्लैक-आउट से बचना चाहता हूं तो मैं प्रगति दिखाना चाहता हूं। क्या यह संभव है? – YuDroid

3

यह AsyncTask का उपयोग करके भी संभव है। यह वर्ग आपके लिए एक धागा बनाता है। आपको इसे उपclass करना चाहिए और doInBackground(...) विधि भरना चाहिए।

4

प्रगति संवाद नहीं दिखाता है क्योंकि आपको एक अलग थ्रेड का उपयोग करना है। एंड्रॉइड में सर्वोत्तम प्रथाओं का उपयोग AsyncTask (अत्यधिक अनुशंसित) का उपयोग करना है। यह भी देखें answer

संबंधित मुद्दे