OnDraw ViewAnimator генерирует исключение NullPointerException, если вы удаляете дочерний элемент в onAnimationEnd
Это не вопрос, больше похоже на то, как поделиться с другими проблемой, с которой я столкнулся и как я ее решил.
По сути, я пытался создать ViewAnimator, который создавал бы дополнительные дочерние элементы в ответ на щелчки пользователей.
Чтобы очистить после того, как я анимировал следующий вид, я положил
outAnimation.setAnimationListener(listener);
и в AnimationListener
public void onAnimationEnd(Animation animation) {
viewAnimator.removeView(out);
}
Теперь проблема с вышеуказанным подходом заключается в том, что сразу после onAnimationEnd он генерирует исключение NullPointerException. По сути, это означает, что ViewAnimator все еще использует дочернее представление, которое анимируется для рисования. Так как я удалил это, там есть нуль. Я сделал свое исследование, и в основном, похоже, это известная ошибка. Смотрите: Анимация Android не завершена на анимации End
Чтобы решить эту проблему, я изменил макет.
<ViewAnimator
android:id="@+id/animator"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/container1"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
<FrameLayout
android:id="@+id/container2"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</FrameLayout>
</ViewAnimator>
и на анимации и могу смело звонить container.removeAllViews()
, Чтобы оживить новый вид, я выбираю скрытый контейнер и
container.addView(newView);
animator.setDisplayedChild(animator.indexOfChild(container));
Буду рад видеть ваши комментарии и советы.
2 ответа
Я столкнулся с этой проблемой и использовал вид post
метод ожидания, пока анимация действительно не закончится:
public void onAnimationEnd(Animation animation) {
//Wait until the container has finished rendering to remove the items.
view.post(new Runnable() {
@Override
public void run() {
//remove view here
}
});
}
Я решил это. У меня есть в анимации и вне анимации. ТАК:
@Override
public void onAnimationEnd(Animation animation) {
if(animationsFinished < 2) animationsFinished++;
else{
this.setInAnimation(null); // Skipping this will cause trouble
this.setOutAnimation(null); // Skipping this will cause trouble
flipper.post(new Runnable(){
@Override
public void run() {
flipper.removeView(previous);
}
});
animationsFinished = 0;
}
}