显示 ProgressDialog Android
Posted
技术标签:
【中文标题】显示 ProgressDialog Android【英文标题】:Show ProgressDialog Android 【发布时间】:2012-04-06 13:46:35 【问题描述】:我有一个 EditText,它从用户那里获取一个字符串和一个 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();
);
【问题讨论】:
ProgressDialog 自 API 级别 O developer.android.com/reference/android/app/ProgressDialog.html987654321@ 起已被弃用 它说“在活动内部使用进度指示器,例如 ProgressBar 内联,而不是使用此模式对话框。”他们为什么不简单地向我们展示如何做到这一点? :) 【参考方案1】:声明你的进度对话框:
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(new View.OnClickListener() public void onClick(View v) // TODO 自动生成的方法存根 System.out.print ("hello"); searchText = (TextView) findViewById(R.id.search_text); searchTextString = searchText.getText().toString(); progress.show(Tab1Activity.this, "对话框标题", "请稍等.. .loading"); readXml(searchTextString); progress.dismiss(); );' nup,正如你在上面看到的,它需要很短的时间,我也写了 readXML 方法。 我想知道 readXML 是否运行得如此之快以至于您看不到进度对话框。如果你在网络上做的事情真的需要几秒钟——首先,你会在一个单独的线程中做这件事,但是你会看到进度对话框的全部效果。如果您最终添加了线程,请确保您在 UI 线程中使用了show
和 dismiss
进度对话框。
但我认为它有足够的时间来显示progressDialog。当我点击 searchButton 大约需要 2-3 秒。
你知道吗,这可能是因为readXML
不允许用户界面喘口气。你可能想把它放在它自己的线程中——或者使用简单的new Thread(...)
(我更喜欢)或者AsyncTask
,正如 Win Myo Htet 所建议的那样。【参考方案2】:
我在我当前的一个项目中使用以下代码,我从互联网下载数据。这一切都在我的活动课程中。
// ---------------------------- 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 手机上进行了测试。【参考方案3】:在为进度条创建对象时,请检查以下内容。
这失败了:
dialog = new ProgressDialog(getApplicationContext());
虽然添加活动上下文有效..
dialog = new ProgressDialog(MainActivity.this);
【讨论】:
【参考方案4】:您不应在主线程中执行资源密集型任务。它会使 UI 无响应,您将获得 ANR。看起来您将做资源密集型的工作并希望用户看到ProgressDialog
。您可以查看http://developer.android.com/reference/android/os/AsyncTask.html 来执行资源密集型任务。它还向您展示了如何使用ProgressDialog
。
【讨论】:
【参考方案5】:我在我当前的一个项目中使用以下代码,我从互联网下载数据。这一切都在我的活动课程中。
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();
Calendar 是我的 calendarActivity,我还创建了一个 CalendarAdapter 来将这些值设置为列表视图。
【讨论】:
以上是关于显示 ProgressDialog Android的主要内容,如果未能解决你的问题,请参考以下文章
显示 ProgressDialog、运行 worker 并等待 worker 完成的 Android 方法
如何在 Android 中进行后台工作时使用 AsyncTask 显示 ProgressDialog? [复制]