2012-01-05 32 views
7

Tôi không thể giải quyết vấn đề này trong 3 ngày. Tôi có nguồn XML đơn giản cho menuPhân tích cú pháp menu Android Tài nguyên XML thành danh sách đối tượng

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

Tôi muốn nhận Danh sách <MenuItem> sau khi phân tích cú pháp của XML này:

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

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

tôi cần điều này cho thao tác phi tiêu chuẩn với MenuItems và không thể làm việc với Resourse này với các phương thức chuẩn như:

... 

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

... 

Ai có thể giúp tôi với điều này? Cảm ơn.

Trả lời

-1

Bạn có thể dễ dàng change menu items at runtime.

Cập nhật sau khi bình luận:

  1. Parse XML để có được ID tài nguyên và các loại tài nguyên (hình ảnh, chuỗi, drawables, vv ..)

  2. Access resources qua Resources lớp. Mỗi loại tài nguyên có phương pháp khác nhau để truy cập nó.

+0

Không, bạn không hiểu tôi. Tôi muốn tạo Menu của riêng mình và muốn viết phương thức như thế này: public void setItemsFromResource (int menuResourceId) {...} để phân tích trình đơn từ XML tài nguyên menu tiêu chuẩn. Tôi đã viết chức năng này thông qua định dạng XML của riêng tôi, nhưng tôi muốn phân tích cú pháp tiêu chuẩn định dạng tài nguyên trình đơn XML :) Nhận các đối tượng có thể kéo được từ biểu tượng, lấy chuỗi từ tài nguyên, v.v. –

11

Điều này sẽ giúp:

... 

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

... 

Việc tạo ra một PopupMenu của nó chỉ là một thủ thuật để tạo ra một đối tượng đơn rằng khi thổi phồng sẽ được lấp đầy với các thông tin xác định trên xml của bạn.

+0

Đây phải là câu trả lời đúng. Và nó hoạt động cho API 7+ sử dụng thư viện hỗ trợ v4 – Iree

1

Cảm ơn Raul. Nó không hoạt động với 2,33. Tôi đã tìm thấy giải pháp 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; 
} 
Các vấn đề liên quan