android - Android MenuItem 以编程方式摇动文本
问题描述
我有一个导航抽屉,其中包含我以编程方式添加的菜单项。单击浮动操作按钮后,我想让所有 MenuItems 开始摇动(如通过动画移动)。
我有一个如下定义的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,因此我认为布局资源文件并不重要。
解决方案
第一步是了解究竟是什么null
。
NullPointerException: Attempt to invoke method 'startAnimation(Animation)' on a null object reference
如果您仔细阅读您的异常,您会注意到它说它正在尝试startAnimation
在空引用上调用。
getActionView().startAnimation());
如果您查看您的代码,您可以看到getActionView()
之前的调用startAnimation()
。这意味着您getActionView()
正在返回null
。
所以,现在我们了解了我们的actionView
is 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
is的原因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);
}
}
您 - 可能 - 无法立即添加动画,这取决于方法以及它与菜单膨胀的确切工作方式。但你应该能够弄清楚。
推荐阅读
- ios - 在swift 4中通过短信推荐朋友
- java - 安装最新的 Eclipse 版本:NullPointerException
- c - 无法在嵌入式设备上分配内存
- django - 输入的字段未保存到模型
- image-processing - 从通过混合一堆图像创建的视频中提取帧正在改变帧的完整性
- java - 即使将文件放在指定的路径中,也找不到文件错误
- git - How to correct already "added to index" files in git?
- java - 喜欢,评论列表视图提要
- xcode - Xcode 10.1 调试器不适用于引入框架
- java - 通过 Xslt 将 xml 动态转换为 xml。?