Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing Android menu XML resource to objects list

I can't resolve this problem for 3 days. I have simple XML resource for menu

<?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>

I want to receive List<MenuItem> after parsing of this XML:

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

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

I need this for non-standard manipulations with MenuItems and can't work with this Resourse with standard methods like:

...

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

...

Can anybody help me with this? Thanks.

like image 585
Dmytro Zarezenko Avatar asked Jan 05 '12 22:01

Dmytro Zarezenko


2 Answers

This will help:

...

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

...

The creation of a PopupMenu its just a trick to create a Menu object that when inflated will be filled with the information defined on your xml.

like image 92
Raul Avatar answered Sep 23 '22 02:09

Raul


Thanks Raul. It don't work for 2.33. I have found solution 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;
}
like image 27
Sergii Suvorov Avatar answered Sep 22 '22 02:09

Sergii Suvorov