【问题标题】:I want a progressbar but get a spinner progressdialog我想要一个进度条,但得到一个微调器进度对话框
【发布时间】:2010-07-24 05:46:52
【问题描述】:

我正在使用公共 AsynTask 下载数据,并且我正在尝试显示一个进度条来显示下载进度。我认为我的代码是正确的,但我得到的只是一个微调进度对话框。我错过了什么吗?为什么进度条不显示?这是代码。 感谢您的任何指点。

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

【问题讨论】:

    标签: android progress-bar progressdialog


    【解决方案1】:

    可能你忘记设置dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    查看这个对我有用的示例代码:

    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.show(...);,然后设置了所有其他参数
    【解决方案2】:

    您似乎正在为 ProgressDialog 使用两个 arg 构造函数,文档建议用于 Context(第一个 arg)和主题 id(第二个 arg)。

    http://developer.android.com/reference/android/app/ProgressDialog.html#ProgressDialog(android.content.Context, int)

    因此,当您认为将 ProgressStyle 设置为 STYLE_HORIZONTAL 时,您根本没有这样做,您将主题 ID 设置为可能不是有效的主题 ID。

    我建议使用一个接受上下文的 arg 构造函数,然后按照 Pentium10 的建议执行并调用 _progressDia.setProgressStyle(ProgressStyle.STYLE_HORIZONTAL);

    【讨论】:

    • 你是对的 - 我认为我通过使用两个参数构造函数将样式设置为水平,但事实并非如此。不知道那是什么....无论如何,现在一切正常。谢谢。
    【解决方案3】:

    你也可以在xml文件中给它这个标签

    style="@android:style/Widget.ProgressBar.Horizo​​ntal"

    【讨论】:

    • 为此增加一百万美元。 gui 编辑器在创建时将其标记为水平,但不会将其创建为水平进度条(这是 eclipse adk 中的错误)
    【解决方案4】:

    输入进度条 在您的 android 项目当前意图 XML 文件中作为进度条

    保存后也检查一下 在 R.java 文件中获取进度条的 id

    应在下载开始时调用意图

    喜欢

    startActivity(new Intent(this, Progress.class));

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      相关资源
      最近更新 更多