Intereting Posts
Android RemoteViews, как установить ScaleType для ImageView внутри виджета? Как получить список установленных медиаплееров Цвет рамки для редактора в Xamarin.Forms ConstraintLayout Vs RelativeLayout & CardView – Кэш и пространство памяти Как отображать близлежащие места, такие как atm, больницы в android google map? Типированный массив должен быть переработан после использования с #recycle () Скрыть клавиатуру, когда пользователь нажимает где-нибудь еще на экране в android Повторять тревогу один раз в неделю в android Как проверить, открыт ли ящик навигации? Измените libusb, чтобы принять файловый дескриптор Изменить ImageView Какое самое удобное устройство для разработки Android? Ионному плагину необходимо удалить платформу и платформу readd, прежде чем она начнет работать Каковы наилучшие методы разработки веб-сервисов для мобильных приложений (особенно Android)? Переопределение Adapter.getView

Как правильно использовать setProgressDrawable ()?

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

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

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

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

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

Итак, вот что я сделал … поставьте setContentView(R.layout.my_screen); onPostExecute методе onPostExecute ! ( onCreate метода 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 я понятия не имею … но это означает, что вы можете устанавливать собственные стили для своих индикаторов выполнения (и они не исчезают на вас!)

 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. Установите новый прогресс

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

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