如何在Android程序中以编程方式更改菜单

8

我有两种不同的菜单布局。当点击一个按钮时,我想在运行时更改充气式菜单。

最初菜单设置为@menu/navigation。当按钮被点击时,我希望它更改为@menu/navigation2

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="th.ac.sd.sdschoolas.MainActivity">

    <FrameLayout
        android:id="@+id/content_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <WebView
            android:id="@+id/web_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="152dp"
            android:layout_height="158dp"
            android:layout_x="23dp"
            android:layout_y="46dp"
            app:srcCompat="@mipmap/logo"
            android:padding="20dp"/>
    </FrameLayout>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/navigation" />

</LinearLayout>

menu/navigation.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/nav1"
        android:icon="@mipmap/homeicon"
        android:title="@string/title_home" />

    <item
        android:id="@+id/nav2"
        android:icon="@mipmap/newsicon01"
        android:title="@string/title_news" />

    <item
        android:id="@+id/nav3"
        android:icon="@drawable/ic_calendar_page_empty"
        android:title="@string/title_cal" />

    <item
        android:id="@+id/nav4"
        android:icon="@drawable/ic_chat_bubbles"
        android:title="@string/title_sms" />

    <item
        android:id="@+id/nav5"
        android:icon="@mipmap/more"
        android:title="@string/title_more" />

</menu>

menu/navigation2.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/nav1"
        android:icon="@mipmap/seticon"
        android:title="@string/title_setting" />

    <item
        android:id="@+id/nav2"
        android:icon="@mipmap/moreicom"
        android:title="@string/title_more2" />

</menu>

不要添加无关的标签。 - Marcin Orlowski
3个回答

21

通过覆盖 onCreateOptionsMenu 方法可以扩展菜单。

您可以使用内部状态来选择要扩展的菜单,例如:

private int menuToChoose = R.menu.navigation;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(menuToChoose, menu);
    return true;
}

然后,在您的OnClickListener中,您需要更改状态并调用invalidateOptionsMenu(),例如:

public void onClick(View v) {
    menuToChoose = R.menu.navigation2;

    invalidateOptionsMenu();
}

只是一个提醒,需要设置setSupportActionBar(id_of_toolbar)才能使其正常工作。 - Sava Dimitrijević

3

使用以下代码以编程方式设置菜单...

navigation.inflateMenu(R.menu.name_menu);

我尝试了但是不起作用。它显示“无法解析inflateMenu(?)方法”。 - phwt
请查看开发者控制台中的BottomNavigationView,它有一个inflate方法,可能是您忘记了某些内容或者做错了,请检查一下... - Chirag.T
它对我有效。但是你需要从布局中删除“app:menu = @menu / navigation”,并在程序中设置它。 - ghane nikraftar

2
你可以使用菜单的add() API来动态添加菜单。 menu.add(0, 0, 0, "选项1").setShortcut('3', 'c'); 你可以在API中获取菜单对象。
public boolean onCreateOptionsMenu(Menu menu)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接