首页 > 解决方案 > 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,因此我认为布局资源文件并不重要。

标签: android

解决方案


第一步是了解究竟是什么null

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

如果您仔细阅读您的异常,您会注意到它说它正在尝试startAnimation在空引用上调用。

getActionView().startAnimation());

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

所以,现在我们了解了我们的actionViewis 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- 没有iconactionView定义。这就是actionViewis的原因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);
    }
}

您 - 可能 - 无法立即添加动画,这取决于方法以及它与菜单膨胀的确切工作方式。但你应该能够弄清楚。


推荐阅读