Android MenuItem以编程方式摇动文本

时间:2018-12-24 20:37:22

标签: android

我有一个导航抽屉,其中包含我以编程方式添加的菜单项。单击浮动操作按钮后,我想使所有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,因此我认为布局资源文件不是很重要。

1 个答案:

答案 0 :(得分:1)

第一步是了解null到底是什么。

NullPointerException: Attempt to invoke method 'startAnimation(Animation)' on a null object reference

如果您仔细阅读了异常,您会发现它表示它正在尝试对空引用调用startAnimation

getActionView().startAnimation());

如果您查看代码,则可以看到getActionView()startAnimation()之前的调用。这意味着您的getActionView()返回了null

因此,既然我们知道我们的actionViewnull,我们可以尝试解决此问题。

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());

您只传递了idname-没有定义iconactionView。这就是actionViewnull的原因。

根据所需的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);
    }
}

您-可能-无法立即添加动画,具体取决于方法以及菜单填充效果如何。但是您应该能够弄清楚。