2012-02-18 73 views
61

Qua xml Tôi có thể thêm các mục menu con vào hành động của mình trong ActionBar.Làm thế nào để thêm các mục menu con vào hành động ActionBar trong mã?

enter image description here

main_menu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_new_form" 
      android:icon="@drawable/ic_new_form" 
      android:title="@string/menu_new_form" 
      android:showAsAction="ifRoom|withText"> 
     <menu> 
      <item android:id="@+id/form1" 
        android:icon="@drawable/attachment" 
        android:title="Form 1" 
        android:onClick="onSort" /> 
      <item android:id="@+id/form2" 
        android:icon="@drawable/attachment" 
        android:title="Form 2" 
        android:onClick="onSort" /> 
     </menu> 
    </item> 
</menu> 

Nhưng làm thế nào tôi có thể thêm các mặt hàng này phụ thông qua mã Java? Nó không làm việc như dưới đây, các mặt hàng phụ đang nhận được bổ sung vào hành động sai (và cũng là drawable không được hiển thị), nút rất đúng, không nút 'New Form' của tôi:

enter image description here

main_menu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_new_form" 
      android:icon="@drawable/ic_new_form" 
      android:title="@string/menu_new_form" 
      android:showAsAction="ifRoom|withText"> 
    </item> 
</menu> 

Java Code:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu, menu); 

    Log.d("MainMenu", ",menu title0: " + menu.getItem(0).getTitle()); 
    // returns "New Form" 

    menu.addSubMenu(0, Menu.NONE, 1, "Form 1").setIcon(R.drawable.attachment); 
    menu.addSubMenu(0, Menu.NONE, 2, "Form 2").setIcon(R.drawable.attachment); 
    return true; 
} 

có cách nào để đạt được điều này, thêm các mục trình đơn phụ qua Mã Java thay vì XML, mà không cần sử dụng PopupMenu (http://developer.android.com/guide/topics/ui/menus.html#PopupMenu)?

Cập nhật (Solution):

đoạn mã cuối cùng của tôi tôi đã kết thúc với để cư trú trong menu con tự động, sau bài trả lời adamp của:

// menu options 
private static final int MENU_PREFERENCES = Menu.FIRST; 
private static final int MENU_LOGOUT = 2; 

@Override 
public boolean onCreateOptionsMenu(final Menu menu) { 
    super.onCreateOptionsMenu(menu); 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu, menu); 
    menu.add(0, MENU_PREFERENCES, 0, getString(R.string.general_preferences)).setIcon(
      android.R.drawable.ic_menu_preferences); 

    // load all available form templates 
    Cursor c = managedQuery(FormsProviderAPI.FormsColumns.CONTENT_URI, null, null, null, null); 
    try { 
     int ixDisplayName = c.getColumnIndex(FormsProviderAPI.FormsColumns.DISPLAY_NAME); 
     int ixId = c.getColumnIndex(FormsProviderAPI.FormsColumns._ID); 
     int cnt = 0; 
     while (c.moveToNext()) { 
      cnt++; 
      Log.d("ID: ", "ID: "+ c.getInt(ixId)); // misusing the group id for the form id 
      menu.getItem(1).getSubMenu().addSubMenu(c.getInt(ixId), Menu.NONE, cnt, c.getString(ixDisplayName)).setIcon(R.drawable.attachment_dark); 
     } 
    } catch (Exception e) { 
     Log.e(TAG, "Error init form templates list.", e); 
    } 

    return true; 
} 
+1

tôi sử dụng này mã cho ứng dụng của tôi @Override \t công khai boolean onCreateOptionsMenu (Menu menu) { \t \t // TODO Phương thức tạo tự động được tạo \t \t super.onCreateOptionsMenu (menu); \t \t MenuInflater inflater = getMenuInflater(); \t \t inflater.inflate (R.menu.poi_menu, menu); \t \t for (int i = 0; i

Trả lời

35

Vâng, có.

Phương thức addSubMenu trả về đối tượng SubMenu. Một SubMenu cũng là Menu, vì vậy bạn có thể gọi add trên đó để thêm các mục vào menu phụ thay vì menu chính. Mã của bạn ở trên đang tạo hai menu con khác nhau cho Biểu mẫu 1 và Biểu mẫu 2 thay vì hai mục trong một menu con Biểu mẫu mới.

Ví dụ:

SubMenu submenu = menu.addSubMenu(0, Menu.NONE, 1, "New Form").setIcon(R.drawable.ic_new_form); 
submenu.add("Form 1").setIcon(R.drawable.attachment); 
+0

Cảm ơn, tôi đã hình dung ra hôm qua và đang làm việc. Tôi nghĩ rằng tôi có thể sử dụng groupIds cho điều đó, nghĩ rằng đó là mục đích của nó và họ treo vật phẩm vào hệ thống phân cấp chính xác. Cảm ơn một lần nữa. –

+0

ID nhóm được sử dụng cho các hình thức nhóm lôgic khác. Ví dụ: nếu các mục menu xuất hiện trong thanh tác vụ dưới dạng "ifRoom", các mục trong cùng một nhóm sẽ tràn cùng nhau - tất cả các mục trong nhóm sẽ xuất hiện trong thanh hoặc tất cả các mục sẽ chuyển sang menu mục bổ sung. Nó rất hữu ích cho các lệnh liên quan không nên được tách ra trong bản trình bày. – adamp

+1

@MathiasLin Bạn đã giải quyết vấn đề này như thế nào? Bởi vì tôi đang đối mặt với nhau. Nhưng như adamp đề nghị Nó thêm menu con trong menu chính (New Form trong menu chính) và sau đó chúng ta click vào "New form", nó cho thấy "Form 1" item nhưng mặc dù drawable không xuất hiện. Bạn có thể chia sẻ một số mã xin vui lòng? –

2

Thêm Trình cung cấp tác có lẽ sẽ dễ dàng hơn. Bạn có thể thử như được giải thích here

1

Bạn nên cân nhắc sử dụng cung cấp tác

dụ: https://gist.github.com/sibelius/7ca0b757492ff6740dec

menu với mục cung cấp hành động

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <item android:id="@+id/action_companies" 
     android:icon="@drawable/ic_list" 
     android:title="@string/action_companies" 
     app:actionProviderClass="com.example.MyActionProvider" 
     app:showAsAction="always"/> 
</menu> 

public class MyActionProvider extends ActionProvider { 

    private Context mContext; 

    public MyActionProvider(Context context) { 
     super(context); 

     mContext = context; 
    } 

    @Override 
    public View onCreateActionView() { 
     //LayoutInflater layoutInflater = LayoutInflater.from(mContext); 
     return null; 
    } 

    @Override 
    public void onPrepareSubMenu(SubMenu subMenu) { 
     super.onPrepareSubMenu(subMenu); 

     subMenu.clear(); 

     subMenu.add("menu 1"); 
     subMenu.add("menu 2"); 
     subMenu.add("menu 3"); 
    } 

    @Override 
    public boolean hasSubMenu() { 
     return true; 
    } 

    @Override 
    public boolean onPerformDefaultAction() { 
     return super.onPerformDefaultAction(); 
    } 
} 
+1

fixed: https: // gist .github.com/sibelius/7ca0b757492ff6740dec –

Các vấn đề liên quan