我有一个导航抽屉,其中包含我以编程方式添加的菜单项。单击浮动操作按钮后,我想使所有MenuItem开始摇动(就像通过动画移动一样)。
我有如下所示的shake.xml文件。
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:duration="150"
android:fromXDelta="-10%"
android:repeatCount="5"
android:repeatMode="reverse"
android:toXDelta="10%"/>
</set>
但是,尝试动画时会得到空引用:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.startAnimation(android.view.animation.Animation)' on a null object reference
menu.findItem(i).getActionView().startAnimation(AnimationUtils.loadAnimation(this.getApplicationContext(), R.anim.shake));
this
是对视图(MainActivity)的引用。我还尝试过仅使用this
参数列表中的loadAnimation
或其他一些参数。
这是周围的方法。
public void removeListMode(List<SingleList> lists){
for (SingleList list: lists){
menu.add(0, list.getInternalListId(), 0, list.getName());
menu.findItem(list.getInternalListId()).getActionView().startAnimation(AnimationUtils.loadAnimation(this.getApplicationContext(), R.anim.shake));
}
}
我正在以编程方式添加MenuItem,因此我认为布局资源文件不是很重要。
答案 0 :(得分:1)
第一步是了解null
到底是什么。
NullPointerException: Attempt to invoke method 'startAnimation(Animation)' on a null object reference
如果您仔细阅读了异常,您会发现它表示它正在尝试对空引用调用startAnimation
。
getActionView().startAnimation());
如果您查看代码,则可以看到getActionView()
是startAnimation()
之前的调用。这意味着您的getActionView()
返回了null
。
因此,既然我们知道我们的actionView
是null
,我们可以尝试解决此问题。
public void removeListMode(List<SingleList> lists){
for (SingleList list: lists){
menu.add(0, list.getInternalListId(), 0, list.getName());
menu.findItem(list.getInternalListId()).getActionView().startAnimation(...);
}
}
就个人而言,我尽量避免以编程方式添加菜单项,就好像您可以使用xml对其进行膨胀一样,这通常更容易,更快捷。但是,当您创建菜单项时,请尝试查看您实际提供的菜单。
menu.add(0, list.getInternalListId(), 0, list.getName());
您只传递了id
和name
-没有定义icon
或actionView
。这就是actionView
是null
的原因。
根据所需的actionView
类型,您将需要找到正确的设置方法。例如,您可以做这样的事情。
public void removeListMode(List<SingleList> lists){
for (SingleList list: lists){
// menu.add returns the MenuItem that is added.
MenuItem item = menu.add(0, list.getInternalListId(), 0, list.getName());
item.setActionView(R.layout.actionbar_indeterminate_progress);
}
}
您-可能-无法立即添加动画,具体取决于方法以及菜单填充效果如何。但是您应该能够弄清楚。