Xamarin Android支持V7 DrawerLayout和动态工具栏/ ActionBar按钮

时间:2015-12-24 20:51:09

标签: android xamarin xamarin.android android-support-library

我正在使用James Montemagno的NavDrawer示例应用程序实现DrawerLayout导航,但我希望我的Fragments能够通过菜单加载,以便能够动态地将操作按钮添加到工具栏/ ActionBar中,以便它们显示为打开菜单的汉堡图标。我不知道该怎么做或者是否有可能。我该如何做到这一点?或者有更合适的方法吗?

1 个答案:

答案 0 :(得分:0)

感谢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覆盖方法进行参考以确定哪个菜单/工具栏项点击了。