如何将菜单动态添加到底部导航视图?
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 方法中看到单击侦听器,您可以将其更改为您想要的任何内容。以上是关于如何将菜单动态添加到底部导航视图?的主要内容,如果未能解决你的问题,请参考以下文章