首页 > 解决方案 > 如何在 Xamarin.Android 中以编程方式获取所有菜单项?

问题描述

我有一个InflateToolbarMenu接受活动并为其填充菜单项的静态方法。此方法将在我的所有活动的 Activity.OnCreateOptionsMenu 上调用,以获得全局可访问的菜单。

充气后如何获得menu类型中的所有项目?Imenu我想遍历它们并将它们都设置为侦听器。我不想在 Activity.OnCreateOptionsMenu 中执行此操作,因为这是一个全局可见工具栏的菜单,在任何活动中的行为方式都相同。

在我的 MenuItemOnMenuItemClickListener 中,我使用了 switch 语句,因此代码看起来不错。

现在我在做:

    public static void InflateToolbarMenu(this AppCompatActivity activity, IMenu menu)
    {
        activity.MenuInflater.Inflate(Resource.Menu.toolbar_menu_common, menu);         
        menu.FindItem(Resource.Id.menu_item_1).SetOnMenuItemClickListener(new MenuItemOnMenuItemClickListener());
        menu.FindItem(Resource.Id.menu_item_2).SetOnMenuItemClickListener(new MenuItemOnMenuItemClickListener());    
        ...                  
        menu.FindItem(Resource.Id.menu_item_N).SetOnMenuItemClickListener(new MenuItemOnMenuItemClickListener());
    }

我想要的就像

    menu.ForEach(m=>m.SetOnMenuItemClickListener(new MenuItemOnMenuItemClickListener());

标签: androidxamarin.android

解决方案


最简单的方法是做这样的事情:

假设有一个IMenu名为Menu

var listMenuItems = new List<IMenuItem>();
for (int i = 0; i < Menu.Size(); i++)
{
   listMenuItems.Add(Menu.GetItem(i)); // here you can add them into a list of items if you want
   Menu.GetItem(i).SetOnMenuItemClickListener(new MenuItemOnMenuItemClickListener());
}

就您添加的代码而言,这是不可能的,因为 IMenu 没有定义,GetEnumerator这意味着它不是通用集合,不能直接循环。


推荐阅读