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

Posted

技术标签:

【中文标题】如何将菜单动态添加到底部导航视图?【英文标题】:How can I add a menu dynamically to bottom navigation view? 【发布时间】:2017-05-11 17:32:18 【问题描述】:

android 有新的 ui 元素 - BottomNavigationView

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

【问题讨论】:

【参考方案1】:

默认情况下,BottomNavigationView 以空菜单开头。您可以使用getMenu() 方法获取Menu 实例,然后像response above 一样添加菜单项。例如,

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 我知道这已经晚了,但是在底部导航视图的 xml 布局中使用 app:itemIconTint【参考方案2】:

在底部导航视图中使用动态选项的简单方法是使用不同的菜单项,如下所示:

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;
        

【讨论】:

问题是如何动态地制作菜单项,例如在运行时。您的解决方案仍然意味着应用程序应该有以上 3 种类型的菜单可用【参考方案3】:

这是一个动态构建菜单项的示例,在主活动中,您有 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);

【讨论】:

你有解决办法吗?? 嗯.. 它可以工作......但是如何将点击监听器绑定到它?请把这个细节说清楚,你会得到+1,伙计! :) 查看哪个视图?如果是底部按钮之一,您可以在 onCreate 方法中看到单击侦听器(在示例中它正在更改菜单集,您可以在之后执行更多操作)。如果是菜单项,您可以在 onOptionsItemSelected 方法中看到单击侦听器,您可以将其更改为您想要的任何内容。

以上是关于如何将菜单动态添加到底部导航视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将地图活动添加到底部导航?

使用喷气背包导航将自定义过渡动画添加到底部导航设置

以编程方式膨胀底部导航视图菜单

如何禁用底部导航视图的菜单项?

如何添加视图,使其位于导航工具栏和标签栏之间

使用UITableViewController使视图坚持到底部