Android, setVisbility не работает в RelativeLayout

Я использую RelativeLayout, чтобы поместить вращающуюся анимацию счетчика поверх изображения-заполнителя, в то время как реальное изображение загружается в фоновом потоке.

Когда настоящее растровое изображение готово, приведенный ниже код запускается в потоке пользовательского интерфейса с помощью Activity.runOnUiThread(Runnable)

Проблема в том, что все мои попытки скрыть вращающееся изображение после загрузки реального изображения, похоже, терпят неудачу. Наконец-то я заработал, перенеся базовое изображение на передний план, но мне просто любопытно, почему setVisibility(View.GONE) и другие методы, которые я пробовал, не работают. Я пробовал разные способы, пытаясь скрыть вращающуюся анимацию, но ни один из них не сработал.

Изображение счетчика объявляется просто в ImageView как:

android:src="@drawable/spinner_black_20"

Затем я запускаю на нем анимацию вращения. Как только реальное изображение загружено, я пытаюсь его скрыть (в потоке пользовательского интерфейса, как указано выше).

View v = (View)imageView.getParent();
ImageView spinner = (ImageView) v.findViewById(R.id.loading_spinner);
if (spinner != null) {
    spinner.getAnimation().cancel(); // this works, the animation stops
    spinner.setVisibility(View.INVISIBLE); // doesn't work, spinner bitmap still there
    spinner.setVisibility(View.GONE); // doesn't work
    spinner.getDrawable().setVisible(false, false); // tried this, no joy
    spinner.refreshDrawableState(); // thought this might help, nope
    spinner.invalidate(); // nor this
    imageView.bringToFront(); // this works, in that spinner disappears to background
}
imageView.setImageBitmap(bitmap);

person evaneus    schedule 14.09.2011    source источник
comment
Вы регистрируетесь или проходите через отладчик внутри блока if(spinner != null)? Если у вас есть ошибка при получении ссылки на счетчик, этот блок не выполняется.   -  person Rich    schedule 15.09.2011
comment
Да, я прошел через это. И на самом деле две строки в этом блоке работают при выполнении: вызов .cancel() работает, как и вызов imageView.bringToFront()   -  person evaneus    schedule 15.09.2011
comment
Просто мысль здесь... может быть, анимация блокирует вызовы setVisibility. Можете ли вы установить AnimationListener на анимацию счетчика, а затем скрыть его в методе onAnimationEnd?   -  person Rich    schedule 16.09.2011
comment
Эта проблема также задается здесь, но до сих пор нет ответа: > stackoverflow.com/questions/6515470/   -  person bigbigteam    schedule 20.06.2012


Ответы (1)


Попробуйте вызвать spinner.clearAnimation(); перед setVisibility.

На что и намекал Рич...

person simonrichardson    schedule 20.09.2011
comment
Это исправило мою очень похожую проблему. - person Ryan; 03.08.2012
comment
У меня тоже была такая же проблема, это исправило ее для меня! - person TharakaNirmana; 15.08.2013
comment
Решил мою проблему!! .. Спасибо!! - person Haya Raed; 12.03.2014
comment
@evaneus Я думаю, что это правильный ответ. (Не хромое исправление, как postDelayed... Которое вызывает больше ошибок, чем исправляет.) Пожалуйста, примите это. - person Evren Ozturk; 31.08.2015
comment
Спасибо, это исправлено. Я потерял час из-за этой ошибки. - person Arlind; 07.09.2015
comment
Святой Бэтмен, так рад, что нашел этот ответ. Я пробовал так много вещей, например, использовал невидимый вместо исчезнувшего и вручную обновлял альфу, когда мне действительно нужно было очистить анимацию. - person Justin; 15.08.2016
comment
После дня попыток ваш ответ наконец помог мне. Спасибо! - person Ulisses Curti; 07.08.2018