UFO ET IT

코드에서 ActionBar 액션에 하위 메뉴 항목을 추가하는 방법은 무엇입니까?

ufoet 2020. 11. 28. 13:19
반응형

코드에서 ActionBar 액션에 하위 메뉴 항목을 추가하는 방법은 무엇입니까?


xml을 통해 내 작업에 하위 메뉴 항목을 추가 할 수 있습니다 ActionBar.

여기에 이미지 설명 입력

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>

그러나 Java 코드를 통해 이러한 하위 항목을 어떻게 추가 할 수 있습니까? 아래와 같이 작동하지 않습니다. 하위 항목이 잘못된 작업에 추가되고 있으며 드로어 블도 표시되지 않습니다. 내 '새 양식'버튼이 아닌 바로 오른쪽 버튼입니다.

여기에 이미지 설명 입력

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>

자바 코드 :

@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;
}

( http://developer.android.com/guide/topics/ui/menus.html#PopupMenu )를 사용 하지 않고 XML 대신 Java 코드를 통해 하위 메뉴 항목을 추가하는 방법이 있습니까?PopupMenu

업데이트 (솔루션) :

마지막 코드 스 니펫은 adamp의 응답에 따라 하위 메뉴를 동적으로 채우는 데 사용되었습니다.

// 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;
}

네, 있습니다.

addSubMenu메서드는 SubMenu개체를 반환 합니다. A SubMenuMenu이므로 add상위 메뉴가 아닌 하위 메뉴에 항목을 추가하도록 호출 할 수 있습니다 . 위의 코드는 단일 새 양식 하위 메뉴 내에 두 개의 항목이 아닌 양식 1과 양식 2에 대해 두 개의 다른 하위 메뉴를 만듭니다.

예:

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

ActionProvider를 추가하는 것이 더 쉬울 수 있습니다. 여기에 설명 된대로 시도 할 수 있습니다.


ActionProvider 사용을 고려해야합니다.

예 : https://gist.github.com/sibelius/7ca0b757492ff6740dec

작업 공급자 항목이있는 메뉴

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

참고 URL : https://stackoverflow.com/questions/9344160/how-to-add-submenu-items-to-actionbar-action-in-code

반응형