在菜单项的可见性模式之间进行动画处理

Posted

技术标签:

【中文标题】在菜单项的可见性模式之间进行动画处理【英文标题】:Animate Between Visibility Modes For Menu Item 【发布时间】:2016-01-11 10:03:34 【问题描述】:

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

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

这是我的代码。

当用户点击编辑时,这会被调用。默认情况下,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;

menu.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" />

【问题讨论】:

【参考方案1】:

我确定您遇到的崩溃是因为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);

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

【讨论】:

我已经更新了问题以显示 menu.xml 文件。每个菜单项都是一个图标,我正在隐藏和显示图标,所以我仍然需要使用 textview 还是应该使用 imageview ,如果是的话,我需要改变什么? 您可以使用图像视图,您可以使用 layoutInflator 服务进行充气和布局。见我上面的回答,这部分也有解释。尝试实现它

以上是关于在菜单项的可见性模式之间进行动画处理的主要内容,如果未能解决你的问题,请参考以下文章

更改 Blazor 菜单中导航项的可见性

如何为 ListView 的 ContextActions 的 MenuItem 添加可见性绑定

菜单项可见性不会部分改变

设计模式之迭代器与组合模式

菜单项悬停动画所有其他项目不是第一个?

如何在 QMenu 中隐藏子菜单