Android 我想要一个progressbar,但需要一个微调器progressdialog
我正在使用一个公共AsynTask下载数据,并且我正在尝试显示一个进度条,该进度条将显示下载进度。我想我的代码是对的,但我得到的只是一个微调器对话框。我错过什么了吗?为什么进度条没有出现?这是代码。 谢谢你的指点Android 我想要一个progressbar,但需要一个微调器progressdialog,android,progress-bar,progressdialog,Android,Progress Bar,Progressdialog,我正在使用一个公共AsynTask下载数据,并且我正在尝试显示一个进度条,该进度条将显示下载进度。我想我的代码是对的,但我得到的只是一个微调器对话框。我错过什么了吗?为什么进度条没有出现?这是代码。 谢谢你的指点 public class FileDownloader extends AsyncTask<String, Integer, Void> { private Context _appContext; private HttpURLConnection _urlConn; p
public class FileDownloader extends AsyncTask<String, Integer, Void>
{
private Context _appContext;
private HttpURLConnection _urlConn;
private ProgressDialog _progressDia = null;
private DialogInterface.OnCancelListener _progDiaCancelListener = new DialogInterface.OnCancelListener()
{
/**
* When the progress dialog is canceled, stop the GET request.
*/
public void onCancel(DialogInterface dialog)
{
FileDownloader.this.cancel(true);
}
};
/**
* Constructor.
* @param appContext
*/
public FileDownloader(Context appContext)
{
_appContext = appContext;
_progressDia = new ProgressDialog(_appContext, ProgressDialog.STYLE_HORIZONTAL);
_progressDia.setMax(100);
_progressDia.setTitle(_appContext.getString(R.string.diaHeader1));
_progressDia.setMessage(_appContext.getString(R.string.diaBody1));
_progressDia.setCancelable(true);
_progressDia.setIndeterminate(false);
_progressDia.setOnCancelListener(_progDiaCancelListener);
}
// Runs on the UI thread
@Override
protected void onPreExecute()
{
_progressDia.setProgress(0);
_progressDia.show();
}
@Override
protected Void doInBackground(String... args)
{
String dloadURL = args[0],
saveLoc = args[1];
...
...
while((len = input.read(buf)) > 0)
{
output.write(buf, 0, len);
total += len;
publishProgress((int)total * 100/lenghtOfFile);
}
...
...
}
catch(SocketTimeoutException ex)
{
}
finally
{
...
}
// This is executed on main UI thread.
@Override
protected void onProgressUpdate(Integer... values)
{
_progressDia.setProgress(values[0]);
}
@Override
protected void onCancelled()
{
...
}
// This is executed on main UI thread.
@Override
protected void onPostExecute(Void result)
{
removeProgressDialog();
...
}
/**
* Remove the message dialog, if still showing.
*/
private void removeProgressDialog()
{
if(_progressDia != null && _progressDia.isShowing())
_progressDia.dismiss();
}
}
公共类文件下载程序扩展异步任务
{
私有上下文appContext;
专用HttpURLConnection\u urlConn;
private ProgressDialog_progressDia=null;
private DialogInterface.OnCancelListener\u progDiaCancelListener=新建DialogInterface.OnCancelListener()
{
/**
*取消进度对话框后,停止GET请求。
*/
public void onCancel(对话框接口对话框)
{
FileDownloader.this.cancel(true);
}
};
/**
*构造器。
*@param-appContext
*/
公共文件下载程序(上下文appContext)
{
_appContext=appContext;
_progressDia=新建ProgressDialog(_appContext,ProgressDialog.STYLE_HORIZONTAL);
_进展直径设定最大值(100);
_progressDia.setTitle(_appContext.getString(R.string.diaHeader1));
_progressDia.setMessage(_appContext.getString(R.string.diaBody1));
_progressDia.setCancelable(真);
_progressDia.SetUndeterminate(假);
_进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程进程;
}
//在UI线程上运行
@凌驾
受保护的void onPreExecute()
{
_progressDia.setProgress(0);
_progressDia.show();
}
@凌驾
受保护的Void doInBackground(字符串…args)
{
字符串dloadURL=args[0],
saveLoc=args[1];
...
...
而((len=input.read(buf))>0)
{
输出写入(buf,0,len);
总+=len;
出版进度((国际)总计*100/长办公室);
}
...
...
}
捕获(SocketTimeoutException ex)
{
}
最后
{
...
}
//这是在主UI线程上执行的。
@凌驾
受保护的void onProgressUpdate(整型…值)
{
_progressDia.setProgress(值[0]);
}
@凌驾
受保护的void onCancelled()
{
...
}
//这是在主UI线程上执行的。
@凌驾
受保护的void onPostExecute(void结果)
{
removeProgressDialog();
...
}
/**
*删除消息对话框(如果仍显示)。
*/
私有void removeProgressDialog()
{
如果(_progressDia!=null&&u progressDia.isShowing())
_progressDia.discouse();
}
}
输入进度条
在android项目中,当前意图XML文件作为进度条
保存后还要检查它
在R.java文件中输入进度条的id
无论何时开始下载,都应该调用intent
像
startActivity(新意图(这个,Progress.class)) 可能您忘记设置
dialog.setProgressStyle(ProgressDialog.STYLE\u水平)代码>
请参见以下适用于我的示例代码:
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(this);
dialog.setMessage("Matching progress");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.setCancelable(false);
dialog.show();
}
/*
* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Void doInBackground(Void... params) {
return null;
}
protected void onPostExecute(Void result) {
dialog.hide();
dialog = null;
}
似乎您正在为ProgressDialog使用两个参数构造函数,文档建议将其用于上下文(第一个参数)和主题id(第二个参数)
,int)
因此,当您认为您正在将ProgressStyle设置为STYLE_HORIZONTAL时,您根本没有这样做,而是将主题id设置为可能不是有效的主题id
我建议在上下文中使用一个参数构造函数,然后按照奔腾10的建议执行并调用_progressDia.setProgressStyle(ProgressStyle.STYLE_HORIZONTAL) 您还可以在xml文件中为它指定此标记
style=“@android:style/Widget.ProgressBar.Horizontal”谢谢-这很有效。我唯一需要改变的是使用单参数构造函数并设置进度样式。谢谢,也帮了我。我的错误是调用了ProgressDialog.show(…)在设置完所有其他参数之后,你是对的-我想我是通过使用双参数构造函数将样式设置为水平的,但事实并非如此。不知道那是什么。。。。不管怎么说,现在一切正常。谢谢,这是一百万美元。当您创建它时,gui编辑器会将其标记为水平,但不会将其创建为水平进度条(这是eclipse adk中的一个错误)