12

有没有办法获取菜单项的 Android ID?我可以看到 getTitle() 但看不到 getId()。我对 ID 值“menu_printer_settings”而不是标题值“printer_settings”和菜单项 ID (getItemId()) 感兴趣。我需要这个 ID 才能使我的 Monkey Talk 脚本也适用于本地化构建。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/menu_printer_settings"        
    android:title="@string/printer_settings"
/>

4

5 回答 5

13

解决方案1:

MenuItem item

String[] id = getResources().getResourceName(item.getItemId()).split("\\/");

然后访问id[1]

解决方案2:

使用titleCondensed匹配id例如

<menu>
            <item android:id="@+id/myid"
                  android:title="some menu title"
                  android:titleCondensed="myid"/>
...
</menu>

然后

String selectedMenuIdString = (String) item.getTitleCondensed();

我更喜欢解决方案 1,因为我不必重复 id 名称。

希望这可以帮助。问候史蒂夫

于 2013-09-17T14:05:48.173 回答
12

尝试这个:

public boolean onOptionsItemSelected(MenuItem item) {

            switch (item.getItemId()) {

            case R.id.menu_printer_settings:
                    //do what you want  
                    break;
                }
}
于 2013-06-05T11:28:58.860 回答
0

尝试使用 getItemID() 如果您仍然遇到问题,请查看以下内容:

MenuItem.getItemId 返回 0 而不是 ItemId

于 2013-06-05T11:29:23.460 回答
0
Menu menu = null;
menu.findItem(R.id.item_id);

这样,您无论如何都可以在活动或片段中访问菜单项

于 2020-10-20T05:32:19.963 回答
-1

通过获取包的所有字段来解决它

        Map<Integer, String> idMap = new HashMap<Integer, String>();
        Class<?> r;
        String rClass = activity.getBaseContext().getApplicationContext().getPackageName()
                + ".R$id";
        try {
            r = Class.forName(rClass);
        } catch (ClassNotFoundException e1) {
            Log.log("Unable to load " + rClass + ": " + e1.getMessage());
            return idMap;
        }
        for (Field f : r.getFields()) {
            int val;
            try {
                val = f.getInt(null);
            } catch (Exception e) {
                throw new IllegalStateException("Unable to get value for " + f.getName() + ": "
                        + e.getMessage());
            }
            idMap.put(val, f.getName());

        }
于 2013-06-13T16:23:23.977 回答