Как правильно использовать setProgressDrawable ()? - PullRequest
11 голосов
/ 17 февраля 2010

У меня проблема с установкой нового Drawable для моего ProgressBar.

Если я использую setProgressDrawable () внутри метода onCreate (), это прекрасно работает. Но когда я пытаюсь вызвать тот же метод внутри обратного вызова обработчика, он не работает, и индикатор выполнения исчезает.

Может кто-нибудь объяснить это поведение? Как я могу решить эту проблему?

Ответы [ 4 ]

14 голосов
/ 08 апреля 2013
downloadingBar.setProgress(0); 

Drawable progressDrawable = getResources().getDrawable(R.drawable.download_progressbar_pause_bg);

progressDrawable.setBounds(downloadingBar.getProgressDrawable().getBounds()); 

downloadingBar.setProgressDrawable(progressDrawable); 

downloadingBar.setProgress(mCurrentPercent);  
  1. Сначала вы должны сбросить прогресс на ноль
  2. Установить границы рисования хода выполнения
  3. Установить новый прогресс рисования
  4. Установить новый прогресс
2 голосов
/ 10 апреля 2011

Сам столкнулся с этой проблемой, и мне удалось заставить ее работать:)

Я использовал AsyncTask для обработки фоновых задач / потоков, но идея должна быть такой жеиспользуя Runnable/Handler (хотя AsyncTask чувствует себя лучше imo).

Итак, это то, что я сделал ... поместил setContentView(R.layout.my_screen); в метод onPostExecute!(т.е. вместо метода onCreate)

Итак, код выглядит примерно так:

public class MyScreen extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.my_screen); !!! Don't setContentView here... (see bottom)

    new MySpecialTask().execute();
}

private int somethingThatTakesALongTime() {
    int result;
    // blah blah blah
    return result;
}

private void updateTheUiWithResult(int result) {
    // Some code that changes the UI
    // For exampe:
    TextView myTextView = (TextView) findViewById(R.id.result_text);
    myTextView.setText("Result is: " + result);

    ProgressBar anyProgressBar = (ProgressBar) findViewById(R.id.custom_progressbar);
    anyProgressBar.setProgressDrawable(res.getDrawable(R.drawable.progressbar_style));
    anyProgressBar.setMax(100);
    anyProgressBar.setProgress(result);       
}

private class MySpecialTask extends AsyncTask<String, Void, Integer> {
    ProgressDialog mProgressDialog;

    @Override
    protected void onPreExecute() {
        mProgressDialog = ProgressDialog.show(MyScreen.this, "", "Calculating...\nPlease wait...", true);
    }
    @Override
    protected Integer doInBackground(String... strings) {
        return somethingThatTakesALongTime();
    }

    @Override
    protected void onPostExecute(Integer result) {
        mProgressDialog.dismiss();
        setContentView(R.layout.my_screen); // setContent view here... then it works...
        updateTheUiWithResult(result);
    }
}
}

Если честно, зачем вам нужно вызывать setContentView в onPostExecuteПонятия не имею ... но это означает, что вы можете установить собственные стили для ваших индикаторов выполнения (и они не исчезнут на вас!)

0 голосов
/ 09 мая 2016

У меня тоже была такая же проблема, но в моем случае это связано с использованием метода Drawable.mutate ().Когда я удалил этот метод, он начал работать нормально.Я также заметил, что эта проблема существует ниже уровня API-21 (леденец).

0 голосов
/ 17 февраля 2010

Может быть, вы поместили код в поток, который не является основным потоком. Если вы хотите работать с пользовательским интерфейсом, вы должны сделать это в основном потоке:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...