【问题标题】:Parsing Android menu XML resource to objects list将 Android 菜单 XML 资源解析为对象列表
【发布时间】:2012-01-05 22:09:03
【问题描述】:

我在 3 天内无法解决此问题。我有用于菜单的简单 XML 资源

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/categoryEditButton"
          android:title="@string/edit"
          android:icon="@drawable/edit" />
    <item android:id="@+id/categoryMoveUpButton"
          android:title="@string/move_up"
          android:icon="@drawable/up" />
    <item android:id="@+id/categoryMoveDownButton"
          android:title="@string/move_down"
          android:icon="@drawable/down" />
    <item android:id="@+id/categoryDeleteButton"
          android:title="@string/delete"
          android:icon="@drawable/trash" />
</menu>

我想在解析这个 XML 后接收 List

public class MenuItem { 
    private CharSequence text;
    private Drawable image;
    private int actionTag;

    //... getters and setters ...
}

我需要它来使用 MenuItems 进行非标准操作,并且无法使用以下标准方法使用此资源:

...

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.some_menu, menu);

...

谁能帮我解决这个问题?谢谢。

【问题讨论】:

    标签: android xml parsing resources menu


    【解决方案1】:

    这会有所帮助:

    ...
    
    PopupMenu p  = new PopupMenu(this, null);
    Menu menu = p.getMenu();
    getMenuInflater().inflate(R.menu.some_menu, menu);
    
    //Usage of menu
    System.out.println("LOG id: "+ menu.getItem(0).getItemId());
    System.out.println("LOG title: "+ menu.getItem(0).getTitle());
    System.out.println("LOG icon: "+ menu.getItem(0).getIcon());
    
    ...
    

    PopupMenu 的创建只是创建 Menu 对象的一个​​技巧,该对象在膨胀时将填充您的 xml 中定义的信息。

    【讨论】:

    • 这应该是正确的答案。它适用于 API 7+,使用支持库 v4
    • @Iree,这个问题没有正确答案,因为 Android 不支持它。这只是解决方法
    【解决方案2】:

    谢谢劳尔。 它不适用于 2.33。 我找到了解决方案Here

    private Menu newMenuInstance(Context context) {
        try {
            Class<?> menuBuilderClass = Class.forName("com.android.internal.view.menu.MenuBuilder");
            Constructor<?> constructor = menuBuilderClass.getDeclaredConstructor(Context.class);
            return (Menu) constructor.newInstance(context);
        } catch (Exception e){
            MyLog.GetMyLog().e(e);
        }
        return null;
    }
    

    【讨论】:

      【解决方案3】:

      简单的解决方案:https://gist.github.com/SaifurRahmanMohsin/8c9df2838d9a52830eb9

      Menu menu = new MenuBuilder(context);
      new MenuInflater(context).inflate(R.menu.my_menu, menu);
      

      MenuItem item = menu.getItem(position)
      

      【讨论】:

      • MenuBuilder 构造函数只能在同一个库组内调用 (groupId=com.android.support)
      【解决方案4】:

      您可以轻松change menu items at runtime

      评论后更新:

      1. Parse XML 获取资源 ID 和资源类型(图像、字符串、可绘制对象等)

      2. Access resources 通过Resources 类。每种资源类型都有不同的访问方法。

      【讨论】:

      • 不,你不懂我。我想创建自己的菜单并希望编写像这样的方法: public void setItemsFromResource(int menuResourceId) {...} 用于从标准菜单资源 XML 解析菜单。我通过自己的 XML 格式编写了这个功能,但我想解析标准的 XML 菜单资源格式:) 从中获取图标的可绘制对象,从资源中获取字符串等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 2021-05-16
      • 2016-12-02
      相关资源
      最近更新 更多