Разбор XML-ресурса меню Android в список объектов - PullRequest
10 голосов
/ 06 января 2012

Я не могу решить эту проблему в течение 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:

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

...

Кто-нибудь может мне помочь с этим?Спасибо.

Ответы [ 4 ]

20 голосов
/ 06 июля 2014

Это поможет:

...

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.

1 голос
/ 12 октября 2014

Спасибо, Рауль. Это не работает для 2,33. Я нашел решение Здесь .

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;
}
0 голосов
/ 28 марта 2018

Простое решение: 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)
0 голосов
/ 06 января 2012

Вы можете легко изменять пункты меню во время выполнения .

Обновление после комментария:

  1. Анализ XML для получения идентификаторов ресурсов и типов ресурсов (изображений, строк, рисованных объектов,и т.д ..)

  2. Доступ к ресурсам через Resources класс.Каждый тип ресурса имеет свой метод доступа к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...