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 项。
我正在基于 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 项。