Android - 正确使用invalidateOptionsMenu()

Bug*_*pen 34 android android-menu android-optionsmenu android-actionbar xamarin

我一直在搜索invalidateOptionsMenu(),我知道它的作用.但我想不出这个方法可能有用的任何现实生活中的例子.

我的意思是,例如,假设我们想要为我们添加一个新MenuItemActionBar,我们可以简单地从菜单中获取onCreateOptionsMenu(Menu menu)并在任何按钮的操作中使用它.

现在我真正的问题是,遵循唯一的使用方式invalidateOptionsMenu()

bool _OtherMenu;
protected override void OnCreate (Bundle bundle)
{
    _OtherMenu = false;
    base.OnCreate (bundle);
    SetContentView (Resource.Layout.Main);
    Button button = FindViewById<Button> (Resource.Id.myButton);
    button.Click += delegate
    {
        if(_OtherMenu)
            _OtherMenu = false;
        else
            _OtherMenu = true;

        InvalidateOptionsMenu ();
    };
}

public override bool OnCreateOptionsMenu (IMenu menu)
{
    var inflater = this.SupportMenuInflater;
    if(_OtherMenu)
        inflater.Inflate (Resource.Menu.another_menu, menu);
    else
        inflater.Inflate (Resource.Menu.main_activity_menu, menu);

    return base.OnCreateOptionsMenu (menu);
}
Run Code Online (Sandbox Code Playgroud)

单击按钮,将出现另一个菜单.再次单击该按钮,将出现上一个菜单.

PS对不起C#语法.

Ale*_*hak 69

invalidateOptionsMenu()用来说Android,菜单内容已经改变,菜单应该重新绘制.例如,单击在运行时添加另一个菜单项的按钮,或隐藏菜单项组.在这种情况下,您应该调用invalidateOptionsMenu(),以便系统可以在UI上重绘它.此方法是OS调用的信号onPrepareOptionsMenu(),您可以在其中实现必要的菜单操作.此外,OnCreateOptionsMenu()在活动(片段)创建期间仅调用一次,因此此方法无法处理运行时菜单更改.

所有都可以在文档中找到:

在系统调用onCreateOptionsMenu()之后,它会保留您填充的菜单的实例,并且不会再次调用onCreateOptionsMenu(),除非由于某种原因菜单失效.但是,您应该仅使用onCreateOptionsMenu()来创建初始菜单状态,而不是在活动生命周期中进行更改.

如果要根据活动生命周期中发生的事件修改选项菜单,可以在onPrepareOptionsMenu()方法中执行此操作.此方法会将Menu对象传递给当前存在,以便您可以对其进行修改,例如添加,删除或禁用项目.(片段还提供onPrepareOptionsMenu()回调.)

在Android 2.3.x及更低版本中,每次用户打开选项菜单(按菜单按钮)时,系统都会调用onPrepareOptionsMenu().

在Android 3.0及更高版本中,当操作栏中显示菜单项时,选项菜单被视为始终打开.当事件发生并且您想要执行菜单更新时,必须调用invalidateOptionsMenu()以请求系统调用onPrepareOptionsMenu().


itz*_*har 19

在应用程序生命周期中使用此命令重新加载新菜单:

getActivity().invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)

  • 不推荐使用,现在正确的调用只是invalidateOptionsMenu()(来自Activity) (5认同)
  • ActivityCompat .invalidateOptionsMenu()现已弃用 (2认同)

Ric*_*cha 3

您需要重写方法onPrepareOptionsMenu(),用相同的方法编写操作菜单的更新代码,如果您使用片段,则setHasOptionsMenu(true);添加onCreateView()

希望对您有帮助