我该如何动态地将菜单添加到底部导航视图?

29

安卓有新的UI元素 - BottomNavigationView。

输入图像描述

我不想将我的菜单包含在xml文件中。我将从后端端接收有关菜单项和顺序的信息。我想要动态创建它们并在onCreate()方法中设置到BottomNavigationView中。这样可以实现吗?

3个回答

33

默认情况下,BottomNavigationView 不包含任何菜单项。您可以使用 getMenu() 方法获取菜单实例,然后按照上面的回答添加菜单项。例如,

BottomNavigationView bottomNavigation = findViewById(R.id.bottom_navigation);
Menu menu = bottomNavigation.getMenu();
menu.add(Menu.NONE, MENU_ITEM_ID_ONE, Menu.NONE, getString(R.string.str_menu_one))
    .setIcon(R.drawable.ic_action_one);

在创建菜单项时,是否可以设置一个色调颜色列表?我目前正在努力为项目的图标和文本设置色调颜色列表。 - kdas
1
@kdas 我知道有点晚了,但是你可以在 XML 布局中使用 app:itemIconTint 来实现底部导航视图的图标着色。 - Psest328

16

在底部导航栏中使用动态选项的简单方法是像这样使用不同的菜单项:

switch (userType){
            case UserTypes.A:
                bottomNavigationView.inflateMenu(R.menu.menu_bottom_navigation_a);
                break;
            case UserTypes.B:
                bottomNavigationView.inflateMenu(R.menu.menu_bottom_navigation_b);
                break;
            case UserTypes.C:
                bottomNavigationView.inflateMenu(R.menu.menu_bottom_navigation_c);
               break;
        }

2
问题是如何在运行时动态地创建菜单项。你的解决方案仍然意味着应用程序应该有以上3种类型的菜单可用。 - kdas

5
这是一个动态构建菜单项的示例,在主活动中有2个布局。您可以从后端获取自己的布局,并使用menu.add动态创建菜单项。
来源:http://www.mobiledevguide.com/2014/01/dynamically-create-menu-items-in-android.html
public class MainActivity extends Activity {

private Button mButtonOne,mButtonTwo;
private static final int MENU_ITEM_ID_ONE =1;
private static final int MENU_ITEM_ID_TWO =2;
private static final int MENU_ITEM_ID_THREE =3;
private static final int MENU_ITEM_ID_FOUR =4;
private static final int MENU_ITEM_ID_FIVE =5;
private static final int MENU_ITEM_ID_SIX =6;
private int mMenuSet = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mButtonOne=(Button) findViewById(R.id.buttonSetOne);
    mButtonTwo=(Button) findViewById(R.id.buttonSetTwo);

    mButtonOne.setOnClickListener(clickListener);
    mButtonTwo.setOnClickListener(clickListener);
}
OnClickListener clickListener=new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.buttonSetOne) {
            mMenuSet=1;
        } else if (v.getId()==R.id.buttonSetTwo){
            mMenuSet=2;
        }
        invalidateOptionsMenu();
        /*
         * if you are using ActionBarSherlock use this.supportInvalidateOptionsMenu();
         * if you are using ActionBarCompat use invalidateOptionsMenu (Activity activity) method
         * */
    }
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);

    if(mMenuSet==1){
        menu.add(Menu.NONE, MENU_ITEM_ID_ONE, Menu.NONE,getString(R.string.str_menu_one)).setIcon(R.drawable.ic_action_one).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        menu.add(Menu.NONE, MENU_ITEM_ID_TWO, Menu.NONE,getString(R.string.str_menu_two)).setIcon(R.drawable.ic_action_two).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        menu.add(Menu.NONE, MENU_ITEM_ID_THREE, Menu.NONE,getString(R.string.str_menu_three)).setIcon(R.drawable.ic_action_three);

    }else if(mMenuSet==2){
        menu.add(Menu.NONE, MENU_ITEM_ID_FOUR, Menu.NONE,getString(R.string.str_menu_four)).setIcon(R.drawable.ic_action_four).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        menu.add(Menu.NONE, MENU_ITEM_ID_FIVE, Menu.NONE,getString(R.string.str_menu_five)).setIcon(R.drawable.ic_action_five).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        menu.add(Menu.NONE, MENU_ITEM_ID_SIX, Menu.NONE,getString(R.string.str_menu_six)).setIcon(R.drawable.ic_action_six);
    }       
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case MENU_ITEM_ID_ONE:
        Toast.makeText(this, "Click on "+ getString(R.string.str_menu_one), Toast.LENGTH_SHORT).show();
        break;
    case MENU_ITEM_ID_TWO:
        Toast.makeText(this, "Click on "+ getString(R.string.str_menu_two), Toast.LENGTH_SHORT).show();
        break;
    case MENU_ITEM_ID_THREE:
        Toast.makeText(this, "Click on "+ getString(R.string.str_menu_three), Toast.LENGTH_SHORT).show();
        break;
    case MENU_ITEM_ID_FOUR:
        Toast.makeText(this, "Click on "+ getString(R.string.str_menu_four), Toast.LENGTH_SHORT).show();
        break;
    case MENU_ITEM_ID_FIVE:
        Toast.makeText(this, "Click on "+ getString(R.string.str_menu_five), Toast.LENGTH_SHORT).show();
        break;
    case MENU_ITEM_ID_SIX:
        Toast.makeText(this, "Click on "+ getString(R.string.str_menu_six), Toast.LENGTH_SHORT).show();
        break;
    case R.id.action_settings:
        Toast.makeText(this, "Click on "+ getString(R.string.action_settings), Toast.LENGTH_SHORT).show();
        break;

    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}}

你有得到任何解决方案吗? - Sanal
嗯...它可以工作...但是如何将点击监听器绑定到它上面呢?请明确这个细节,你会得到一个加1的赞,伙计! :) - NoWar
要添加到哪个视图? 如果是底部按钮之一,您可以在onCreate方法中看到单击侦听器(在示例中它正在更改菜单集,您可以执行更多操作)。 如果是菜单项,则可以在onOptionsItemSelected方法中看到单击侦听器,您可以将其更改为任何您想要的内容。 - Idanatz

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