【问题标题】:Get menu group id in Android?在Android中获取菜单组ID?
【发布时间】:2012-04-12 01:48:51
【问题描述】:

是否可以获取菜单项所在的组 ID?

我认为这会起作用,但 getGroupId() 总是返回 0:

xml:

<?xml version="1.0" encoding="UTF-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/menu_group">        
        <item android:id="@+id/edit"
              android:title="Edit" />

        <item android:id="@+id/delete"
              android:title="Delete" />               
    </group>              
</menu>

代码:

@Override
public boolean onContextItemSelected(MenuItem item) {

    int groupId = item.getGroupId(); //always zero

    return super.onContextItemSelected(item);
}

【问题讨论】:

    标签: android contextmenu


    【解决方案1】:

    onMenuItemSelected(int featureId, MenuItem item)而不是onContextItemSelected(MenuItem item)中调用这个方法,OptionMenu和ContextMenu是android中两种不同类型的菜单

    【讨论】:

    • 我的代码在一个片段中,不确定是否可以使用onMenuItemSelected。我遇到了这里描述的问题:stackoverflow.com/questions/5297842/… 并希望避免在代码中创建我的菜单(更喜欢在 XML 中使用它们)。希望我可以将菜单包装在一个组中并检测onContextItemSelected中的组ID
    • 我最终遵循了我链接到的那个问题中的代码。有点蹩脚,但似乎不是更好的方法。
    【解决方案2】:

    我已经用 Fragment 对其进行了测试,它可以工作。看下面的代码:

    public class ContextMenuActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        ContextMenuFragment content = new ContextMenuFragment();
        getSupportFragmentManager().beginTransaction().add(
                android.R.id.content, content).commit();
    }
    
    public static class ContextMenuFragment extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View root = inflater.inflate(R.layout.fragment_context_menu, container, false);
            registerForContextMenu(root.findViewById(R.id.long_press));
            return root;
        }
    
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
    
            new MenuInflater(getActivity().getApplication()).inflate(R.menu.menu, menu);
    
            menu.add(777, 0, Menu.NONE, "Menu A");
            menu.add(777, 1, Menu.NONE, "Menu B");
        }
    
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case 0:
                    Log.i("ContextMenu", "Item 1a was chosen");
                    Log.i("ContextMenu", "group: " + item.getGroupId());
                    return true;
                case 1:
                    Log.i("ContextMenu", "Item 1b was chosen");
                    Log.i("ContextMenu", "group: " + item.getGroupId());
                    return true;
                case R.id.edit:
                    Log.i("ContextMenu", "Item Edit was chosen");
                    Log.i("ContextMenu", "group: " + item.getGroupId());
                    return true;
                case R.id.delete:
                    Log.i("ContextMenu", "Item Delete was chosen");
                    Log.i("ContextMenu", "group: " + item.getGroupId());
                    return true;
            }
            return super.onContextItemSelected(item);
        }
    }
    }
    

    `

    <menu
      xmlns:android="http://schemas.android.com/apk/res/android">
        <group android:id="@+id/menu_group">        
            <item android:id="@+id/edit"
                  android:title="Edit"
                  android:orderInCategory="0"
                  android:menuCategory="system"  />
    
            <item android:id="@+id/delete"
                  android:title="Delete" 
                  android:orderInCategory="0"
                  android:menuCategory="system"  />               
        </group>              
    </menu>
    

    【讨论】:

    • 是的,只是看起来很蹩脚,你必须在代码中使用menu.add。不明白为什么片段不能自动检测显示哪个菜单。
    • 请注意,我在 java 代码中添加菜单和从 xml 中添加菜单,都可以被选中并获取它们的组 ID。 :)
    【解决方案3】:

    试试这个代码 - 详情请参阅 cmets:

    editTxt.setCustomSelectionActionModeCallback(new ActionMode.Callback(){
    
                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu)
                {
    
                    MenuItem [] menuitems=new MenuItem[]{};
                    int i=menuitems.length;
    
                   // menu.removeGroup(i);
                    //or
                   // menu.setGroupVisible(i,false);
                    //or
                    menu.setGroupVisible(i,false);
    
    
                    MenuInflater inflater = mode.getMenuInflater();
                    inflater.inflate(R.menu.copypaste, menu);
    
    
                    return true;
                }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 2017-09-13
      • 1970-01-01
      • 2017-09-25
      • 2013-05-23
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多