Java 在API 22上启动AnimatedVectorDrawable时出现NullPointerException
我正在使用此代码片段启动一个Java 在API 22上启动AnimatedVectorDrawable时出现NullPointerException,java,android,nullpointerexception,animatedvectordrawable,Java,Android,Nullpointerexception,Animatedvectordrawable,我正在使用此代码片段启动一个AnimatedVectorDrawable动画: AnimatedVectorDrawable vectorAnim = (AnimatedVectorDrawable) ((ImageView) child).getDrawable(); vectorAnim.start(); (基本上我得到了ImageView的android:src,这是一个AnimatedVectorDrawable,然后我启动了动画) 到目前为止,它在我测试的每台设备上都能正常工作,但当
AnimatedVectorDrawable
动画:
AnimatedVectorDrawable vectorAnim = (AnimatedVectorDrawable) ((ImageView) child).getDrawable();
vectorAnim.start();
(基本上我得到了ImageView的android:src
,这是一个AnimatedVectorDrawable
,然后我启动了动画)
到目前为止,它在我测试的每台设备上都能正常工作,但当我在API 22设备上运行我的应用程序时,会出现以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at android.graphics.drawable.AnimatedVectorDrawable.isStarted(AnimatedVectorDrawable.java:427)
at android.graphics.drawable.AnimatedVectorDrawable.start(AnimatedVectorDrawable.java:440)
at com.brickx.creartup.MainRoadmapAdapter.animateViews(MainRoadmapAdapter.java:263)
at com.brickx.creartup.MainRoadmapAdapter.access$100(MainRoadmapAdapter.java:31)
at com.brickx.creartup.MainRoadmapAdapter$1.onInflate(MainRoadmapAdapter.java:66)
at android.view.ViewStub.inflate(ViewStub.java:284)
at com.brickx.creartup.MainRoadmapAdapter.inflateBackground(MainRoadmapAdapter.java:215)
at com.brickx.creartup.MainRoadmapAdapter.onCreateViewHolder(MainRoadmapAdapter.java:71)
at com.brickx.creartup.MainRoadmapAdapter.onCreateViewHolder(MainRoadmapAdapter.java:31)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6519)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5706)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5589)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5585)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2231)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1558)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1518)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:610)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3719)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3436)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3988)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:611)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:874)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1172)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
你知道这是怎么回事吗
编辑
我知道NullPointerException的意思,但遗憾的是,我认为我无法控制这一点。我不明白为什么会在这里抛出这个异常…好的,我找到了问题的根源!即使我不知道如何妥善解决这个问题 当我尝试在没有
target
属性的AnimatedVectorDrawable
上启动动画时,会发生崩溃(我正在使用定义向量drawable及其动画)
更准确地说,我认为android会查看动画向量
元素,如果未找到目标
,则会抛出一个错误。同样,到目前为止,我只在API 22上遇到了这个问题,但我还没有测试其他API
目前我只能想到两种解决方案:
- 将至少一个
元素添加到target
中AnimatedVectorDrawable
- 如果不需要动画,也可以使用一个简单的
(我使用了VectorDrawable
,无论我的向量是否已设置动画,以便以后如果需要,可以轻松地向其添加动画)AnimatedVectorDrawable
animatedvectorrawable
中添加一个哑target
<target android:name="vector">
<aapt:attr name="android:animation">
<objectAnimator
android:propertyName="alpha"
android:valueTo="1"/>
</aapt:attr>
</target>
这样,
AnimatedVectorDrawable
中不会发生任何更改,但不会显示错误。但我不建议这样做,因为它相当脏,可能会导致其他问题。在API 21和22上发现了相同的问题
帮助我的解决方案是在objectAnimator
上用xml定义参数android:valueFrom
和android:valueTo
<objectAnimator
android:propertyName="fillColor"
android:duration="250"
android:valueFrom="#393749"
android:valueTo="#00000000"
android:valueType="colorType"/>
但是在上面的API上,它在没有android:valueFrom(疯狂的droid不会节省我们的时间:)@PrzemysławMoskal的情况下工作,这个NPE被扔到了android级别,询问者无法控制
AnimatedVectorDrawable
类如何处理空指针。我怀疑你标记为傻瓜的问题的答案对这个提问者是否有帮助。@pushasha是的,我可能不应该在我的标题中写NullPointerException!我的错,但你是对的。我的问题更多的是关于这个异常的来源,而不是它的性质。@Keysaw我没有足够的信息给你一个答案,但我可以告诉你,空指针是指存储在AnimatedVectorDrawableState
中的Animator
数组。我怀疑这会有帮助,但如果没有其他人回答,希望这会给你一些东西继续下去。我建议你创建一个项目,在那里你可以始终如一地复制这一点,并在@pushasha上提交一个bug,你是绝对正确的。对此我很抱歉。你知道有没有可能“解冻”?我删除了建议重复的评论,但当我看到我提出的标志时,它仍然在等待审查。我想节省版主的时间并将其删除,因为这是不相关的,但我找不到一种方法来做到这一点。超级奇怪和有趣的异常,但事实上,如果在API级别22上的动画向量xml元素中没有目标,您将发生此崩溃。谷歌请修复它,也许通过在崩溃中提供更多有用的信息+来自meI的1有一个动画向量,它有一个目标,但它仍然抛出一个NPE。