【问题标题】:How to get the Android ID for a menu item in Android?如何获取 Android 中菜单项的 Android ID?
【发布时间】:2013-06-01 01:41:10
【问题描述】:

有没有办法获取菜单项的 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"
/>

【问题讨论】:

  • menuItem.getItemId() 不适合你吗?
  • @Adil,是的,它确实返回一个整数,我想获取 ID 字符串“menu_printer_settings”

标签: android string menu resources monkeyrunner


【解决方案1】:

解决方案 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 名称。

希望这会有所帮助。 问候 史蒂夫

【讨论】:

    【解决方案2】:

    试试这个:

    public boolean onOptionsItemSelected(MenuItem item) {
    
                switch (item.getItemId()) {
    
                case R.id.menu_printer_settings:
                        //do what you want  
                        break;
                    }
    }
    

    【讨论】:

    • 能否以编程方式获取 ID 字符串名称“menu_printer_settings”?
    • 很简单:item.getTitle()
    • 标题和ID字符串不同。标题是“printer_settings”,但我对 XML 文件中定义的 ID 字符串“menu_printer_settings”感兴趣。
    • 我们需要ID的原因是我们的脚本(MonkeyTalk自动化工具)可以在所有本地化构建上运行,如果我们只使用ID记录一次。如果我们使用标题,那么脚本将不会以不同的语言播放。
    【解决方案3】:

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

    MenuItem.getItemId returns 0 instead of ItemId

    【讨论】:

      【解决方案4】:
      Menu menu = null;
      menu.findItem(R.id.item_id);
      

      这样你就可以在活动或片段中访问菜单项

      【讨论】:

        【解决方案5】:

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

                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());
        
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 2017-09-13
          • 1970-01-01
          • 2012-01-26
          • 2011-05-30
          • 2013-02-06
          相关资源
          最近更新 更多