android - 在菜单项的可见性模式之间设置动画

标签 android animation menu visibility

我正在尝试在菜单的可见性模式之间设置动画。 默认情况下,所有菜单项都是隐藏的,但是当用户单击编辑按钮时,我想用动画显示所有项目。

我已经实现了更改菜单项可见性的第一部分,效果很好,但动画部分使应用程序崩溃。

这是我的代码。

当用户点击编辑时调用。默认情况下 edit_mode 为 false。

if (!edit_mode) {
  edit_mode = true;
  supportInvalidateOptionsMenu();
}

这是菜单代码。

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_add__custom, menu);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    MenuItem photo = menu.findItem(R.id.photo);
    photo.setVisible(edit_mode);
    if (edit_mode)
        photo.getActionView().animate().alpha(1.0f);

    MenuItem date = menu.findItem(R.id.date);
    date.setVisible(edit_mode);
    if (edit_mode)
        date.getActionView().animate().alpha(1.0f);

    MenuItem done = menu.findItem(R.id.done);
    done.setVisible(edit_mode);
    if (edit_mode)
        done.getActionView().animate().alpha(1.0f);

    return edit_mode;
}

菜单.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
    android:id="@+id/date"
    android:icon="@drawable/ic_event_white_24dp"
    android:orderInCategory="200"
    android:title="Date"
    app:showAsAction="ifRoom" />

<item
    android:id="@+id/done"
    android:icon="@drawable/ic_done_white_24dp"
    android:orderInCategory="300"
    android:title="Done"
    app:showAsAction="ifRoom" />

<item
    android:id="@+id/photo"
    android:icon="@drawable/ic_photo_white_24dp"
    android:orderInCategory="100"
    android:title="Done"
    app:showAsAction="ifRoom" />

最佳答案

我确定您遇到的崩溃是因为 getActionView() 抛出的 NullException。首先要以这种方式设置动画,您首先在 onCreateOptionMenu() 期间设置了 actionView。这样,当您在 onPrepareOptionsMenu 中获取 actionView 时,它不会因此而崩溃,然后您可以为其设置动画。 onPrepareOptionsMenu 会在您按下菜单按钮时执行,因此您在此时为其设置动画的逻辑是正确的。

如果它只是你想在菜单项中显示的文本,它应该是这样的,

final MenuItem photo;

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_my_report, menu);
        photo = menu.findItem(R.id.action1);
        TextView textView = new TextView(this);
        textView.setText("I am menu item");
        photo.setActionView(textView);
        return true;
    }
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
if(someCondition)
{
        photo.getActionView().animate().alpha(1.0f);
}
        return super.onCreateOptionsMenu(menu);
    }

如果你想要一个复杂的自定义文本,你可以使用 layoutInflator 服务来设置它。这可以在您的 onCreate 中进行,

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ImageView view = (ImageView)inflater.inflate(R.layout.some_view, null);
        Animation rotation = AnimationUtils.loadAnimation(this, R.anim.fade);

onCreateOptionMenu,

view.startAnimation(rotation);
        photo.setActionView(view);

这只是为了让您了解需要做什么,您可以尝试一下并满足您的需要。

关于android - 在菜单项的可见性模式之间设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106315/

相关文章:

android - 如何在Kotlin中使自定义动画制作器工作(对alpha属性进行动画处理)

android - 在 Android 设备中使用 sklearn

java - 媒体播放器错误

python - 使用 ArtistAnimation 的 Matplotlib 动画更新标题

jquery - 像 Netflix 上的水平滚动图像

android - 如何从菜单(onOptionsItemSelected)中缩小/隐藏(不可见)ViewStub?

Android fragment 过渡

javascript - IE9 CSS3 属性应用但不支持

javascript - 使用 Webkit/jQuery 将外部页面加载到当前页面的最佳方式

css - html5自定义内联水平菜单