Xamarin Android 支持 V7 DrawerLayout 和动态 Toolbar/ActionBar 按钮

Xamarin Android Support V7 DrawerLayout and dynamic Toolbar/ActionBar buttons

我正在基于 James Montemagno 的 NavDrawer 示例应用程序实现 DrawerLayout 导航,但我希望通过菜单加载的片段能够动态地将操作按钮添加到 Toolbar/ActionBar所以它们与打开菜单的汉堡包图标一起出现。我不确定该怎么做或是否可能。我该如何做到这一点?还是有更合适的做法?

感谢 Xamarin 论坛上的@JamesMontemagno 帮助我回答这个问题。这是我必须做的才能让它发挥作用:

https://forums.xamarin.com/discussion/comment/172433#Comment_172433

在我的 Fragment 的 OnCreateView 覆盖中,我需要在调用基本方法之前将 HasOptionsMenu 属性 设置为 true。

public override View OnCreateView(LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState)
        {
            HasOptionsMenu = true;
            base.OnCreateView(inflater, container, savedInstanceState);
            ...
        }

然后我不得不像这样覆盖 OnCreateOptionsMenu 和 OnOptionsItemSelected...

public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)
{
base.OnCreateOptionsMenu(menu, inflater);

        var filterActionItem = menu.Add(Menu.None, Resource.Id.toolbar_filter_action, Menu.None, new Java.Lang.String("Filter"));

        MenuItemCompat.SetShowAsAction(filterActionItem, MenuItemCompat.ShowAsActionIfRoom);
    }

    public override bool OnOptionsItemSelected(IMenuItem item)
    {
        switch (item.ItemId)
        {
            case Resource.Id.toolbar_filter_action:
                Toast.MakeText(Context, "Selected Item: " + item.TitleFormatted, ToastLength.Short).Show();
                return true;
        }
        return base.OnOptionsItemSelected(item);
    }

请注意,我创建了一个 Ids.xml 文件来存储我的菜单项 ID,就像这样...

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <item name="toolbar_filter_action" type="id" />
</resources>

这允许我在 menu.Add(...) 方法中引用生成的 toolbar_filter_action id。如果您有多个可以由不同片段添加的菜单项,那么您需要将 Id 作为资源存储以便于重用,并供 OnOptionsItemSelected 覆盖方法参考以确定单击了哪个 menu/toolbar 项。