3

这不是一个问题,更像是与他人分享我遇到的问题以及我是如何解决的。
基本上,我试图创建一个 ViewAnimator,它会根据用户的点击创建额外的孩子。
在我为下一个视图设置动画后进行清理,我把

outAnimation.setAnimationListener(listener);

并在 AnimationListener

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

现在,上述方法的问题是,在 onAnimationEnd 之后立即抛出 NullPointerException。基本上,这意味着 ViewAnimator 仍在使用正在绘制动画的子视图。由于我已将其删除,因此那里为空。我已经完成了我的研究,基本上,这似乎是一个已知的错误。请参阅:Android 动画未在 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

2 回答 2

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
          }
        });
      }
于 2012-04-02T21:57:50.713 回答
2

我解决了。我有 inAnimation 和 outAnimation。所以:

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

    }


}
于 2012-07-18T10:03:23.087 回答