ProgressDialog Android anzeigen

78

Ich habe einen EditText, der dem Benutzer einen String und einen searchButton entnimmt. Wenn Sie auf den searchButton klicken, wird die XML-Datei durchsucht und in der ListView angezeigt.

Ich kann Eingaben vom Benutzer entgegennehmen, die XML-Datei durchsuchen und den vom Benutzer gesuchten Wert auch in der ListView anzeigen.

Was ich möchte, ist, ein anzuzeigen, ProgressDialognachdem auf den searchButton geklickt wurde, wie "BITTE WARTEN ... DATEN ABRUFEN ..." oder so etwas und es zu schließen, wenn die Daten angezeigt werden.

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

        }
    });
}
Captaindroid
quelle
2
ProgressDialog ist seit API Level O developer.android.com/reference/android/app/ProgressDialog.html
Varvara Kalinina
2
Es heißt "Verwenden Sie eine Fortschrittsanzeige wie ProgressBar inline innerhalb einer Aktivität, anstatt diesen modalen Dialog zu verwenden." Warum zeigen sie uns nicht einfach, wie es geht? :)
Wolf359

Antworten:

265

Erklären Sie Ihren Fortschrittsdialog:

ProgressDialog progress;

Wenn Sie bereit sind, den Fortschrittsdialog zu starten:

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

und damit es verschwindet, wenn du fertig bist:

progress.dismiss();

Hier ist ein kleines Thread-Beispiel für Sie:

// 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();
dldnh
quelle
Ich habe den folgenden Code geschrieben, funktioniert aber nicht: 'searchButton.setOnClickListener (neuer View.OnClickListener () {public void onClick (View v) {// TODO Automatisch generierte Methode stub System.out.print ("Hallo"); searchText = (TextView) findViewById (R.id.search_text); searchTextString = searchText.getText (). ToString (); progress.show (Tab1Activity.this, "Dialogtitel", "Bitte warten ... Laden"); readXml (searchTextString) ); progress.dismiss ();}}); '
Captaindroid
nup, es dauert sehr wenig Zeit, wie Sie oben sehen können, ich habe auch readXML-Methode geschrieben.
Captaindroid
Ich frage mich, ob readXML so schnell ausgeführt wird, dass Sie den Fortschrittsdialog nicht sehen. Wenn Sie etwas über das Netzwerk tun, das wirklich ein paar Sekunden gedauert hat - zunächst einmal würden Sie dies in einem separaten Thread tun, aber dann würden Sie die volle Wirkung des Fortschrittsdialogs sehen. Wenn Sie am Ende Threads hinzufügen, stellen Sie sicher, dass Sie showund dismissder Fortschrittsdialog im UI-Thread angezeigt werden.
dldnh
Aber ich denke, es hat genug Zeit, um progressDialog zu zeigen. Wenn ich auf searchButton geklickt habe, dauert es ungefähr 2-3 Sekunden.
Captaindroid
Weißt du was? Wahrscheinlich readXMLliegt es daran, dass die Benutzeroberfläche nicht zu Atem kommt. Vielleicht möchten Sie es in einen eigenen Thread einfügen - entweder mit simple new Thread(...)(was ich bevorzuge) oder mit AsyncTask, wie Win Myo Htet vorschlägt.
dldnh
7

Ich verwende den folgenden Code in einem meiner aktuellen Projekte, in denen ich Daten aus dem Internet herunterlade. Es ist alles in meiner Aktivitätsklasse.

// ---------------------------- 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;
    }

}
the_gesslar
quelle
Die Ausrichtung hat sich für mich gut geändert. Ich habe gerade in einem 2.3.3 AVD und auf meinem ICS-Telefon getestet.
the_gesslar
Wie implementiere ich das?
user1708134
6

Überprüfen Sie beim Erstellen des Objekts für den Fortschrittsbalken Folgendes.

Dies schlägt fehl:

dialog = new ProgressDialog(getApplicationContext());

Beim Hinzufügen der Aktivitäten funktioniert der Kontext.

dialog = new ProgressDialog(MainActivity.this);
amalBit
quelle
2

Sie sollten keine ressourcenintensiven Aufgaben im Hauptthread ausführen. Dadurch reagiert die Benutzeroberfläche nicht mehr und Sie erhalten eine ANR. Es scheint, als würden Sie ressourcenintensive Dinge tun und möchten, dass der Benutzer das sieht ProgressDialog. Unter http://developer.android.com/reference/android/os/AsyncTask.html können Sie ressourcenintensive Aufgaben ausführen. Es zeigt Ihnen auch, wie Sie a verwenden ProgressDialog.

Gewinnen Sie Myo Htet
quelle
1

Ich verwende den folgenden Code in einem meiner aktuellen Projekte, in denen ich Daten aus dem Internet herunterlade. Es ist alles in meiner Aktivitätsklasse.

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

    }

und führen Sie es in der OnCreate-Methode wie aus new GetData().execute();

Dabei ist Kalender meine Kalenderaktivität und ich habe auch einen Kalenderadapter erstellt, um diese Werte auf eine Listenansicht festzulegen.

AndroidGeek
quelle