android - 从 Android 中的 LinearLayout 中删除 View 时出现异常

标签 android animation android-linearlayout

我试图在将自定义 View 从 LinearLayout 容器中移除之前对其进行动画处理。只有我不断收到 NullPointerException,我无法追踪到任何特定的地方。

当我添加了两个 View 并删除了第一个 View 时会发生异常。

我的代码是:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.form_alg);
    fadeInAnimation = AnimationUtils.loadAnimation(getApplicationContext(),
            R.anim.witness_fade_in);

    list = (LinearLayout) this.findViewById(R.id.alg_list_getuigen);

    addWitness = (ImageButton) this
            .findViewById(R.id.alg_getuige_toevoegen);
    addWitness.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            final View w = View.inflate(getApplicationContext(),
                    R.layout.form_getuige, null);

            ImageButton button = (ImageButton) w
                    .findViewById(R.id.getuige_verwijderen);
            button.setOnClickListener(new android.view.View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Log.d(TAG, "deleteView");
                    Animation fadeOutAnimation = AnimationUtils
                            .loadAnimation(getApplicationContext(),
                                    R.anim.witness_fade_out);
                    fadeOutAnimation
                            .setAnimationListener(new AnimationListener() {
                                @Override
                                public void onAnimationEnd(
                                        Animation animation) {
                                    list.removeView(w);
                                    list.invalidate();
                                }

                                @Override
                                public void onAnimationRepeat(
                                        Animation animation) {
                                }

                                @Override
                                public void onAnimationStart(
                                        Animation animation) {
                                }
                            });
                    w.setVisibility(View.VISIBLE);
                    w.startAnimation(fadeOutAnimation);
                    w.setVisibility(View.INVISIBLE);
                }
            });
            Log.d(TAG, "addView");

            w.setVisibility(View.INVISIBLE);
            list.addView(w);
            w.startAnimation(fadeInAnimation);
            w.setVisibility(View.VISIBLE);
            list.invalidate();
        }

    });
}

这是堆栈跟踪:

07-03 03:17:30.335: WARN/dalvikvm(343): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-03 03:17:30.365: ERROR/AndroidRuntime(343): FATAL EXCEPTION: main
07-03 03:17:30.365: ERROR/AndroidRuntime(343): java.lang.NullPointerException
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1372)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.View.draw(View.java:6986)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.widget.ScrollView.draw(ScrollView.java:1409)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.View.draw(View.java:6883)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.View.draw(View.java:6883)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewRoot.draw(ViewRoot.java:1522)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.os.Looper.loop(Looper.java:123)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at android.app.ActivityThread.main(ActivityThread.java:3683)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at java.lang.reflect.Method.invokeNative(Native Method)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at java.lang.reflect.Method.invoke(Method.java:507)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-03 03:17:30.365: ERROR/AndroidRuntime(343):     at dalvik.system.NativeStart.main(Native Method)

最佳答案

我遇到了同样的问题。您必须使用 Handler 来执行修改 UI 的代码(在本例中为 removeView())。我会添加一个 Handler 字段并在您的 onCreate() 方法中构造它。然后,在 onAnimationEnd() 中,只需执行以下操作:

fHandler.post(new Runnable() {
    @Override
    public void run() {
        list.removeView(w);
        list.invalidate();
    }
}

关于android - 从 Android 中的 LinearLayout 中删除 View 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6560472/

相关文章:

android - Activity 识别继续在奥利奥服务

ios - complateTransition 不要关闭 View swift 2

java - 使用过渡和插值器让图像经过 2 个坐标列表

android - 将 textView 和 editText 放在 android 应用程序的同一行

java - 角色绘制不正确,出现在错误的位置一秒钟

android - 通过maven安装apk

android - 如何获取LinearLayout的高度

javascript - 如何使用javascript使div或对象逐渐移动到鼠标点击点?

android - LinearLayout * 元素大小

android - 不显示 ScrollView 中 RelativeLayout 的最后一个 LinearLayout