2012-04-02 1 views
3

Это не вопрос, скорее как разделение с другими проблемы, с которой я столкнулся, и как я ее разрешил.
В принципе, я пытался создать ViewAnimator, который создавал бы дополнительные дочерние элементы в ответ на клики пользователей.
Для очистки после того, как я анимированный следующий вид, я поставилViewAnimator's OnDraw выбрасывает исключение NullPointerException, если вы удаляете дочерний элемент on onAnimationEnd

outAnimation.setAnimationListener(listener); 

и в AnimationListener

public void onAnimationEnd(Animation animation) { 
    viewAnimator.removeView(out); 
} 

Теперь проблема с выше подхода, сразу же после того, как onAnimationEnd, она бросает NullPointerException , В принципе, это означает, что ViewAnimator все еще использует дочернее представление, которое анимируется для рисования. Так как я удалил его, там есть null. Я сделал свое исследование, и в основном, похоже, это известная ошибка. См.: Android Animation is not finished on onAnimationEnd

Чтобы решить эту проблему, я изменил макет.

<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> 

и onAnimationEnd я могу смело назвать container.removeAllViews(). Чтобы анимировать новый вид, я выбираю скрытый контейнер и

container.addView(newView); 
animator.setDisplayedChild(animator.indexOfChild(container)); 

Я буду рад видеть ваши комментарии и советы.

ответ

4

Я столкнулся с этой проблемой и использовал метод 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 
      } 
     }); 
     } 
+0

Я попробовать подобный подход, 'postDelayed (Runnable задачи, внутр delayMillis) .' В моем случае это вызвало неодушевленность снова по какой-то странной причине. –

1

я решил. У меня есть inAnimation и outAnimation. SO:

@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; 

    } 


} 
Смежные вопросы