显示进度对话框 Android

我有一个 EditText,它从用户获取一个 String 和一个 searchButton。 当单击 searchButton 时,它将搜索 XML 文件并在 ListView 中显示它。

我能够从用户那里获取输入,在 XML 文件中搜索,并在 ListView 中显示用户搜索的值。

我想要的是在 searchButton 被单击后显示一个 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();


}
});
}
212333 次浏览

声明你的进度对话框:

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

不应该在主线程中执行资源密集型任务。它将使用户界面无响应,你将得到一个 ANR。似乎您将要做一些资源密集型的工作,并希望用户看到 ProgressDialog。您可以查看 http://developer.android.com/reference/android/os/AsyncTask.html来完成资源密集型任务。它还向您展示了如何使用 ProgressDialog

我使用以下代码在我目前的项目之一,我下载的数据从互联网上。都在我的活动课上。

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


}

我使用以下代码在我目前的项目之一,我下载的数据从互联网上。都在我的活动课上。

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


}

并像 new GetData().execute();一样在 OnCreate 方法中执行它

其中 Calendar 是我的 calendarActivity,我还创建了一个 CalendarAdapter 来将这些值设置为列表视图。

在为进度栏创建对象时,请检查以下内容。

这种做法失败了:

dialog = new ProgressDialog(getApplicationContext());

当添加活动上下文时。

dialog = new ProgressDialog(MainActivity.this);