获取 NullPointerException:尝试从字段“int android.view.View.mViewFlags”读取 - Android 动画

2024-05-13

我已经实现了一个动画,其中我在回收器视图中有图像视图,单击该项目时我想在回收器视图之外的图像视图上做一些动画,这样 - 我创建了一个新的图像视图, - 将其添加到主容器中 - 做了动画 - 最后我将它从主容器中取出

以下是回收器视图的点击项的代码:

Code:

final ImageView iv = new ImageView(getContext());
iv.setImageDrawable(fromView.getDrawable());
iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
iv.setLayoutParams(fromView.getLayoutParams());
v_mainContainer.addView(iv);

AnimationSet animatinSet = new AnimationSet(false);
animatinSet.setFillAfter(false);
animatinSet.setFillBefore(true);
animatinSet.setDuration(1500);
animatinSet.setInterpolator(new DecelerateInterpolator());

// ... rest of the animation 

animatinSet.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {

    }

    @Override
    public void onAnimationEnd(Animation animation) {
        v_mainContainer.removeView(iv);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }
});

animatinSet.setAnimationListener(animationListner);
animatinSet.setDuration(1500);

iv.startAnimation(animatinSet);

当我在 1 个视图上运行此动画时,它工作正常。但是,当我在同一视图上多次运行动画时,以及在一个动画完成之前运行另一个动画时,我会收到以下错误。

错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mbh.testApp, PID: 9628
    java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3549)
        at android.view.View.draw(View.java:17071)
        at android.view.View.updateDisplayListIfDirty(View.java:16050)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
        at android.view.View.updateDisplayListIfDirty(View.java:16013)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
        at android.view.View.updateDisplayListIfDirty(View.java:16013)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
        at android.view.View.updateDisplayListIfDirty(View.java:16013)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
        at android.view.View.updateDisplayListIfDirty(View.java:16013)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
        at android.view.View.updateDisplayListIfDirty(View.java:16013)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:656)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:662)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:770)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2796)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2604)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2211)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
        at android.view.Choreographer.doCallbacks(Choreographer.java:683)
        at android.view.Choreographer.doFrame(Choreographer.java:619)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我尝试在从主容器中删除视图时放置 try-catch 块,但它没有改变结果并且仍然出现相同的错误。

我也尝试过这个答案https://stackoverflow.com/a/4295570/2296787 https://stackoverflow.com/a/4295570/2296787但这并没有解决问题

奇怪的是,该错误没有告诉我到底在哪里引发了异常。

预先感谢您的帮助。


As @sasikumar已经提到解决方案是运行测试真实设备

但我也在模拟器上解决了这个问题,方法是在删除动画结束侦听器中的视图之前添加 500 毫秒延迟的 postDelayed:

animatinSet.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        iv.setVisibility(View.GONE);
        v_mainContainer.postDelayed(new Runnable() {
            @Override
            public void run() {
                v_mainContainer.removeView(iv);
            }
        }, 500);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }
});

这适用于模拟器和真实设备

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 NullPointerException:尝试从字段“int android.view.View.mViewFlags”读取 - Android 动画 的相关文章

随机推荐

  • 具有用于角色授权的空间的 AD 组

    我正在尝试获得与 AD 组合作的角色授权 然而 由于它包含空格 它似乎不起作用 我尝试过没有空格的 AD 组 它们工作得很好
  • libicui18n.so.52:无法打开共享对象文件

    我一直在使用 libicu 来检测在 docker ubuntu 内部运行的节点应用程序中的字符集 这是通过模块完成的节点 icu 字符集检测器 https github com mooz node icu charset detector
  • SQL where 连接集必须包含所有值,但可以包含更多值

    我有三张桌子offers sports和连接表offers sports class Offer lt ActiveRecord Base has and belongs to many sports end class Sport lt
  • 在 WSDL 中包含 XSD

    我正在编写一个 wsdl 文件来在未来 SoapUI 中部署模拟服务 但我在包含我的 xsd 文件时遇到问题 XSD File
  • 将位图旋转 90 度

    我有一个1 个 64 位整数 我需要在 8 x 8 区域中旋转 90 度 最好使用直接位操作 我想不出任何方便的算法 例如 这个 0xD000000000000000 110100000000000000000000000000000000
  • 抑制 Rspec 3 的回溯

    我正在使用 rspec 3 2 0 和 capybara 2 4 4 并在我的 spec helper rb 文件中如下所示 config full backtrace false 对于大多数错误 我都会得到回溯 例如 Failure Er
  • 查找所有子字符串的出现和位置

    我正在编写一个程序来解析一些保存为文本文件的数据 我想做的是找到大海捞针中每根针的位置 我已经可以读取文件并确定出现的次数 但我也希望找到索引 string str sub str is string to search sub is th
  • SQL 查询在多用户环境中返回错误值

    一段时间以来 我们在我们的一个客户站点上发现了奇怪的数据完整性问题 经过大量调查后 我们现在已将其隔离为数据库调用 如果两个用户同时调用同一个存储过程 有时一个用户会得到另一个用户的结果 我们设置了一个测试来验证这一点 并且我们有一个循环
  • 将声音图形化地表示为波

    我创建了一个记录和播放声音的应用程序 我正在寻找一种显示简单波形的方法 记录声音的表示 不需要动画 只需一个简单的图表 如果可以选择波的子集也很好 当然更好 也播放该部分 总而言之 我正在寻找什么 一种以图形方式将录制的声音表示为波的方法
  • 无法更改 MS Access 2007 上的数据类型

    我有一个巨大的数据库 800MB 其中包含一个名为 上次修改日期 的字段 目前该字段作为文本数据类型输入 但需要将其更改为日期 时间字段以执行一些查询 我有另一个完全相同的数据库 但其中只有 35MB 的数据 当我更改数据类型时 它工作正常
  • Google App Engine 数据存储写入:如何远程启用/禁用只读模式?

    在阅读备份时GAE 的数据存储 https developers google com appengine docs adminconsole datastoreadmin where 我们强烈建议您在备份或恢复期间将应用程序设置为只读模式
  • MySQL 过去 12 个月的月度销售情况,包括没有销售的月份

    SELECT DATE FORMAT date b AS month SUM total price as total FROM cart WHERE date lt NOW and date gt Date add Now interva
  • 使用 SYS_CONNECT_BY_PATH 的 Oracle 累积计数

    当我尝试对实际数据执行以下查询时 它返回了更多记录数 请帮助解决这个问题 下面是表 DM TEMP SUMMING DVC BY FW 中的实际数据 device count dmc id firmware version cg id im
  • 在 Eclipse 中的调试会话期间记录所有跟踪信息

    我想记录调试会话的每个步骤的所有调试信息 以便稍后处理所有这些数据 例如调用的方法的名称 参数值 所有变量值等 有没有任何选项可以实现此目的 我应该在哪里更改代码才能实现此目的 一件重要的事情 它不是一个 java 程序 这是一个使用 ac
  • 在并行调用中,限制每秒执行次数

    使用 TPL Parallel ForEach 有一种开箱即用的方法来限制每单位时间调用方法的次数 即每秒不超过 50 次调用 这与限制线程数不同 也许有一些简单的技巧可以使这项工作正常进行 一种解决方案是制作以下线程安全版本https s
  • OOP 中的静态和动态变量/方法是什么?

    我试图更好地理解 OOP 中的基本概念 面向对象编程中的静态和动态变量和方法是什么 例如 使用 this 与使用双冒号 之间有什么区别 this this gt a method 优点 缺点 这个 不是自我记录的 如下所示 this gt
  • 在 iOS 上不显示数字键盘

    根据苹果的文档 http developer apple com library safari documentation AppleApplications Reference SafariHTMLRef Articles InputTy
  • boost::algorithm::join 的一个很好的例子

    我最近想用提升 算法 加入 http www boost org doc libs 1 41 0 doc html string algo reference html header boost algorithm string join
  • 获得 IAP 产品响应后出现 Objective-C 错误

    此代码来自 Phonegap 代码 IAP 插件 错误发生在 发送的js 之后的代码行上 除了最后一个 nil 之外 发送到该函数的所有元素均非零 我什至将它们注销以确保它们已发送 该代码直接来自插件 https github com us
  • 获取 NullPointerException:尝试从字段“int android.view.View.mViewFlags”读取 - Android 动画

    我已经实现了一个动画 其中我在回收器视图中有图像视图 单击该项目时我想在回收器视图之外的图像视图上做一些动画 这样 我创建了一个新的图像视图 将其添加到主容器中 做了动画 最后我将它从主容器中取出 以下是回收器视图的点击项的代码 Code