6

これが以前に尋ねられた場合は申し訳ありませんが、これに対する答えが見つかりません(検索しました!)

アプリが長いタスクを実行している間、不確定なプログレスバーを表示して回転させるために、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());
    }
4

5 に答える 5

9

setProgressプログレスバーが不確定でない場合にのみ有効です。

不確定とは、進行量がないことを意味し、タスクを終了するために完了/残りの進行量がわからない場合に使用されます。

ドキュメントに記載されているように:

プログレスバーは不確定にすることもできます。不確定モードでは、プログレス バーは進行状況を示すことなく周期的なアニメーションを表示します。このモードは、タスクの長さが不明な場合にアプリケーションで使用されます。不確定な進行状況バーは、回転するホイールまたは水平バーのいずれかです。

一方、プログレス バーさえ表示されない場合は、背景が明るいのではないでしょうか。

style 属性を次のように設定してみてください。

style="@android:style/Widget.ProgressBar.Inverse"
于 2012-04-29T22:55:19.797 に答える
8

質問を誤解しているかもしれませんが、カスタムの不定スピンを作ろうとしてここにたどり着いた人にとって、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>

タスクの開始時と終了時に、それぞれに と の可視性を設定ProgressBarできVISIBLEますGONE

回転速度を変更したい場合、この回答では、toDegreesを 360 の倍数 (つまり、720、1080 など) に変更するように指示されています。

于 2015-04-20T20:16:51.007 に答える
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をお読みください。

于 2012-04-30T23:58:49.077 に答える
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 Annotations はおそらくこれだけでも価値がありますが、他にも便利な Annotations がたくさんあります。

于 2013-12-30T00:26:26.397 に答える