Android Indeterminate ProgressBar不会旋转

时间:2012-04-29 22:50:06

标签: android progress-bar

很抱歉,如果之前有人询问,但我找不到答案(我已搜索过了!)

我尝试按照google / android文档制作一个不确定的进度条,并在我的应用执行冗长的任务时旋转。

protected void readData(final String whatToFind) 
{

    try
    {
        if (whatToFind.length() == 0)
        {
            adapter.notifyDataSetChanged();
            return;
        }


        mProgress.setVisibility(View.VISIBLE);
        mProgressText.setVisibility(View.VISIBLE);

        m_dialog = new ProgressDialog(this);
            m_dialog.setTitle("Searching...");
            m_dialog.setMessage("Please wait while searching...");
            m_dialog.setIndeterminate(true);
            m_dialog.setCancelable(true); 
            m_dialog.show(); 

        new Thread(new Runnable() 
        {
            public void run() 
            {
                mHandler.post(new Runnable() 
                {    
                    public void run() 
                    {

                                while (LotsOfWorkGoingOn)  
                                {
                                    // Update the progress bar
                                        mHandler.post(new Runnable() {
                                         public void run() {
                                             mProgress.setProgress(m_i); /// vain attempt to make the progressbar spin
                                         }
                                     });                                

                                                         mProgress.setVisibility(View.GONE);
                                                         mProgressText.setVisibility(View.GONE);
                                                         m_dialog.hide();

                                            }

                        });
            }
        }).start();

    }
    catch (Exception ex)
    {
        Log.e(LOGid, "Error listing items:" + ex.getStackTrace());
    }

5 个答案:

答案 0 :(得分:9)

setProgress仅在进度条不是Indeterminate时生效。

不确定意味着它没有进度金额,并且在您不知道完成任务所完成/剩余的进度量时使用它。

documentation中所述:

  

进度条也可以是不确定的。在不确定模式下,进度条显示循环动画,但不显示进度。当任务的长度未知时,应用程序将使用此模式。不确定的进度条可以是旋转轮或水平杆。

另一方面,如果你甚至没有看到进度条,也许你的背景很浅?

尝试将style属性设置为:

style="@android:style/Widget.ProgressBar.Inverse"

答案 1 :(得分:5)

假设存在UI阻止问题,您可以扩展AsyncTask并以这种方式使用它:

ProgressDialog m_dialog;

protected void readData(final String whatToFind) {

    if (whatToFind.length() == 0) {
        adapter.notifyDataSetChanged();
        return;
    }

    m_dialog = new ProgressDialog(this);
    new LengthyTask().execute();
}

//AsyncTask<Params, Progress, Result>
//Params: type passed in the execute() call, and received in the doInBackground method
//Progress: type of object passed in publishProgress calls
//Result: object type returned by the doInBackground method, and received by onPostExecute()
private class LengthyTask extends AsyncTask<Object, Integer, Object> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // initialize the dialog
        m_dialog.setTitle("Searching...");
        m_dialog.setMessage("Please wait while searching...");
        m_dialog.setIndeterminate(true);
        m_dialog.setCancelable(true);
        m_dialog.show();
    }

    @Override
    protected Object doInBackground(Object... params) {
        // do the hard work here
        // call publishProgress() to make any update in the UI
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // called from publishProgress(), you can update the UI here
        // for example, you can update the dialog progress
        // m_dialog.setProgress(values[0]); --> no apply here, because we made it indeterminate
    }

    @Override
    protected void onPostExecute(Object result) {
        super.onPostExecute(result);

        // close the dialog
        m_dialog.dismiss();
        //do any other UI related task
    }
}

要对AsyncTask进行更深入的说明,请阅读herehere

答案 2 :(得分:5)

也许我误解了这个问题,但对于那些试图让他们的自定义不确定ProgressBar旋转的人来说,希望这可以帮助你解决问题。将android:indeterminateDrawable设置为不是实际资产,而是设置为您的自定义可绘制资源。

定义res / drawable / progress_indeterminate_custom.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
    <rotate
      android:drawable="@drawable/your_custom_drawable"
      android:fillAfter="true"
      android:fromDegrees="0"
      android:pivotX="50%"
      android:pivotY="50%"
      android:toDegrees="360" />
  </item>
</layer-list>

当任务开始和结束时,您可以分别设置ProgressBarVISIBLEGONE的可见性。

如果你想修改轮换的速度,this answer说要将toDegrees更改为360的倍数(即720,1080等)。

答案 3 :(得分:3)

在我的情况下,我只是忘记了所有动画都在设备上禁用。没有阻止或任何不良的控制设置。

答案 4 :(得分:1)

AsyncTask应该可以解决这个问题,但是我建议Android Annotations使这类事情不那么冗长(而且容易得多)。

void myMethod() {
    someBackgroundWork("hello", 42);
}

背景中发生的事情:

@Background
void someBackgroundWork(String aParam, long anotherParam) {
    [...]
    doInUiThread("hello", 42);
}

可以在UI线程中调用某些内容。

@UiThread
void doInUiThread(String aParam, long anotherParam) {
    [...]
}

单独使用Android注释可能是值得的,但还有许多其他有用的注释。