ProgressDialog Android दिखाएँ


78

मेरे पास एक EditText है जो उपयोगकर्ता और एक खोजबटन से एक स्ट्रिंग लेता है। जब सर्चबटन पर क्लिक किया जाता है, तो यह XML फ़ाइल के माध्यम से खोज करेगा और इसे सूची दृश्य में प्रदर्शित करेगा।

मैं उपयोगकर्ता से इनपुट लेने में सक्षम हूं, एक्सएमएल फ़ाइल के माध्यम से खोज कर सकता हूं और सूची दृश्य में भी उपयोगकर्ताओं की खोज की गई कीमत प्रदर्शित कर सकता हूं।

खोज के ProgressDialogबाद मुझे जो दिखना है, वह है बटलटन को "कृपया ध्यान दें ... रिटेटिंग डेटा ..." या ऐसा कुछ क्लिक करें और डेटा दिखाए जाने पर इसे खारिज कर दें।

public class Tab1Activity extends ListActivity {
private Button okButton;
private Button searchButton;
Toast toast;
String xml;

private TextView searchText;
private String searchTextString;
HashMap<String, String> o;
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab1);

    searchButton = (Button) findViewById(R.id.search_button);
    searchButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            System.out.print("hello");

            searchText = (TextView) findViewById(R.id.search_text);
            searchTextString = searchText.getText().toString();
            readXml(searchTextString);

        }
    });

}

private void readXml(String searchTextString1) {
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

    String xml = XMLfunctions.getXML();
            //Here XMLfunctions is class name which parse xml
    Document doc = XMLfunctions.XMLfromString(xml);

    int numResults = XMLfunctions.numResults(doc);

    if ((numResults <= 0)) {
        Toast.makeText(Tab1Activity.this, "Testing xmlparser",
                Toast.LENGTH_LONG).show();
        finish();
    }

    NodeList nodes = doc.getElementsByTagName("result");

    for (int i = 0; i < nodes.getLength(); i++) {
        HashMap<String, String> map = new HashMap<String, String>();

        Element e = (Element) nodes.item(i);
        String nameMapString = XMLfunctions.getValue(e, "name");



         if ( nameMapString.toLowerCase().indexOf(searchTextString1.toLowerCase()) != -1 )   // != -1 means string is present in the search string
            {
                map.put("id", XMLfunctions.getValue(e, "id"));
                map.put("name",  XMLfunctions.getValue(e, "name"));
                map.put("Score",  XMLfunctions.getValue(e, "score"));
                mylist.add(map);
            }
    }

    ListAdapter adapter = new SimpleAdapter(this, mylist,
            R.layout.parsexml, new String[] { "name", "Score" }, new int[] {
                    R.id.item_title, R.id.item_subtitle });

    setListAdapter(adapter);

    final ListView lv = getListView();
    lv.setTextFilterEnabled(true);
    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            @SuppressWarnings("unchecked")
            HashMap<String, String> o = (HashMap<String, String>) lv
                    .getItemAtPosition(position);


                Toast.makeText(Tab1Activity.this,
                         "Name "+o.get("name")+"  Clicked", Toast.LENGTH_LONG)
                        .show();                

        }
    });
}


2
इसमें कहा गया है "प्रगति मोड का उपयोग करें जैसे कि प्रगति मोडल इनलाइन डायलॉग का उपयोग करने के बजाय एक गतिविधि के अंदर।" वे केवल हमें यह दिखाने के लिए क्यों नहीं करते हैं? :)
वुल्फ 359

जवाबों:


265

अपनी प्रगति संवाद की घोषणा करें:

ProgressDialog progress;

जब आप प्रगति संवाद शुरू करने के लिए तैयार हों:

progress = ProgressDialog.show(this, "dialog title",
    "dialog message", true);

और जब वह पूरा हो जाए तो उसे दूर करने के लिए:

progress.dismiss();

यहां आपके लिए एक छोटा सा उदाहरण दिया गया है:

// Note: declare ProgressDialog progress as a field in your class.

progress = ProgressDialog.show(this, "dialog title",
  "dialog message", true);

new Thread(new Runnable() {
  @Override
  public void run()
  {
    // do the thing that takes a long time

    runOnUiThread(new Runnable() {
      @Override
      public void run()
      {
        progress.dismiss();
      }
    });
  }
}).start();

मैंने नीचे कोड लिखा है, लेकिन काम नहीं करता है: 'searchButton.setOnClickListener (नया दृश्य ।nClickListener () {सार्वजनिक शून्य पर क्लिक करें (देखें v) {// TODO ऑटो-जनरेट किया गया तरीका stub System.out.print ("hello"); searchText = (TextView) findViewById (R.id.search_text); searchTextString = searchText.getText ()। ToString (); प्रगति .show (Tab1Activity.this, "Dialog Title", "Please Wait ... लोड हो रहा है"); readTml (searchTextString) ); प्रगति .वाद ();}});)
कप्तानडॉर्

हाँ, यह बहुत कम समय लगता है जैसा कि आप ऊपर देख सकते हैं कि मैंने readXML विधि भी लिखी है।
कप्तानडॉ

मुझे आश्चर्य है कि अगर readXML इतनी तेज़ी से चलता है कि आप प्रगति संवाद नहीं देखते हैं। यदि आप नेटवर्क पर कुछ कर रहे थे जो वास्तव में कुछ सेकंड ले लिया - अच्छी तरह से सबसे पहले, आप एक अलग थ्रेड में ऐसा करेंगे, लेकिन फिर आपको प्रगति संवाद का पूरा प्रभाव दिखाई देगा। यदि आप थ्रेड्स जोड़ना समाप्त करते हैं, तो सुनिश्चित करें कि आप showऔर dismissथ्रेड थ्रेड में प्रगति संवाद करें।
dldnh

लेकिन मुझे लगता है कि प्रगति दिखाने के लिए पर्याप्त समय है। जब मैंने searchButton पर क्लिक किया तो लगभग 2-3 सेकंड लगते हैं।
कप्तानडॉ

तुम्हें पता है क्या, यह शायद है क्योंकि readXMLयूआई अपनी सांस को पकड़ने की अनुमति नहीं है। आप इसे अपने स्वयं के धागे में रखना चाह सकते हैं - या तो सरल new Thread(...)(जो मुझे पसंद है) या साथ AsyncTask, जैसा कि विन मायो हेटेट सुझाव देते हैं।
dldnh

7

मैं अपनी वर्तमान परियोजनाओं में से एक में निम्नलिखित कोड का उपयोग कर रहा हूं जहां मैं इंटरनेट से डेटा डाउनलोड करता हूं। यह मेरी गतिविधि कक्षा के अंदर है।

// ---------------------------- START DownloadFileAsync // -----------------------//
class DownloadFileAsync extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // DIALOG_DOWNLOAD_PROGRESS is defined as 0 at start of class
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... urls) {
        try {
            String xmlUrl = urls[0];

            URL u = new URL(xmlUrl);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            int lengthOfFile = c.getContentLength();

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            long total = 0;

            while ((len1 = in.read(buffer)) > 0) {
                total += len1; // total = total + len1
                publishProgress("" + (int) ((total * 100) / lengthOfFile));
                xmlContent += buffer;
            }
        } catch (Exception e) {
            Log.d("Downloader", e.getMessage());
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("ANDRO_ASYNC", progress[0]);
        mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_DOWNLOAD_PROGRESS:
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Retrieving latest announcements...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(true);
        mProgressDialog.show();
        return mProgressDialog;
    default:
        return null;
    }

}

अभिविन्यास मेरे लिए बस ठीक बदल गया। मैंने अभी-अभी 2.3.3 AVD और अपने ICS फोन में परीक्षण किया है।
the_gesslar

6

प्रोग्रेसबार के लिए ऑब्जेक्ट बनाते समय निम्नलिखित की जांच करें।

यह विफल रहता है:

dialog = new ProgressDialog(getApplicationContext());

गतिविधियों के संदर्भ को जोड़ते हुए काम करता है ।।

dialog = new ProgressDialog(MainActivity.this);

2

आपको मुख्य थ्रेड में संसाधन गहन कार्यों को निष्पादित नहीं करना चाहिए। यह UI को अनुत्तरदायी बना देगा और आपको एक ANR मिलेगा। ऐसा लगता है कि आप संसाधन गहन सामान कर रहे हैं और उपयोगकर्ता को देखना चाहते हैं ProgressDialog। संसाधन गहन कार्य करने के लिए आप http://developer.android.com/reference/android/os/AsyncTask.html पर एक नज़र डाल सकते हैं । यह आपको यह भी दिखाता है कि कैसे उपयोग करें ProgressDialog


1

मैं अपनी वर्तमान परियोजनाओं में से एक में निम्नलिखित कोड का उपयोग कर रहा हूं जहां मैं इंटरनेट से डेटा डाउनलोड करता हूं। यह मेरी गतिविधि कक्षा के अंदर है।

private class GetData extends AsyncTask<String, Void, JSONObject> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            progressDialog = ProgressDialog.show(Calendar.this,
                    "", "");

        }

        @Override
        protected JSONObject doInBackground(String... params) {

            String response;

            try {

                HttpClient httpclient = new DefaultHttpClient();

                HttpPost httppost = new HttpPost(url);

                HttpResponse responce = httpclient.execute(httppost);

                HttpEntity httpEntity = responce.getEntity();

                response = EntityUtils.toString(httpEntity);

                Log.d("response is", response);

                return new JSONObject(response);

            } catch (Exception ex) {

                ex.printStackTrace();

            }

            return null;
        }

        @Override
        protected void onPostExecute(JSONObject result) 
        {
            super.onPostExecute(result);

            progressDialog.dismiss();

            if(result != null)
            {
                try
                {
                    JSONObject jobj = result.getJSONObject("result");

                    String status = jobj.getString("status");

                    if(status.equals("true"))
                    {
                        JSONArray array = jobj.getJSONArray("data");

                        for(int x = 0; x < array.length(); x++)
                        {
                            HashMap<String, String> map = new HashMap<String, String>();

                            map.put("name", array.getJSONObject(x).getString("name"));

                            map.put("date", array.getJSONObject(x).getString("date"));

                            map.put("description", array.getJSONObject(x).getString("description"));

                            list.add(map);
                        }

                        CalendarAdapter adapter = new CalendarAdapter(Calendar.this, list);

                        list_of_calendar.setAdapter(adapter);
                    }
                }
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
            else
            {
                Toast.makeText(Calendar.this, "Network Problem", Toast.LENGTH_LONG).show();
            }
        }

    }

और OnCreate मेथड में इसे निष्पादित करें new GetData().execute();

जहाँ कैलेंडर मेरी CalendarActivity है और मैंने इन मानों को सूची दृश्य में सेट करने के लिए एक CalendarAdapter भी बनाया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.