2012-01-05 69 views
7

我無法解決這個問題3天。我有一個菜單簡單的XML資源解析Android菜單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); 

... 

有人能幫助我嗎?謝謝。

回答

-1

您可以很容易地change menu items at runtime。評論後

更新:

  1. Parse XML獲取資源ID和資源類型(圖片,字符串,圖形等。)

  2. 通過ResourcesAccess resources。每種資源類型都有不同的訪問方法。

+0

不,你不明白我。我想創建我自己的菜單,並希望像這樣的寫入方法:public void setItemsFromResource(int menuResourceId){...}用於從標準菜單資源XML解析菜單。我通過自己的XML格式編寫了這個功能,但是我想解析標準的XML菜單資源格式:)從圖標中獲取可繪製對象,從資源中獲取字符串等。 – 2012-01-05 22:22:40

11

這將幫助:

... 

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的創建它只是一個伎倆來創建充氣時將充滿你的XML定義的信息菜單對象。

+0

這應該是正確的答案。它適用於使用支持庫v4的API 7+ – Iree 2015-09-23 16:03:17

1

謝謝勞爾。 它不適用於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; 
}