以编程方式更改图标菜单

时间:2016-12-05 16:56:21

标签: android replace menu icons programmatically

我想澄清一下,我谈的是导航抽屉菜单,而不是动作按钮图标。

我需要以编程方式更改菜单图标。为此我接下来做了:

private Menu menu;

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.navigation_menu, menu);
    return super.onCreateOptionsMenu(menu);
}

....我尝试用:

更改图标项目
 menu.getItem(6).setIcon(getResources().getDrawable(R.mipmap.ic_flash_on_black_24dp));

不幸的是,该项目保持不变。可以帮我解决问题吗?

我观察到不推荐使用getDrawable,但不知道如何使用新的。

2 个答案:

答案 0 :(得分:0)

尝试在onPrepareOptionsMenu方法中放置图标修改代码:

  

准备要显示的屏幕标准选项菜单。每次显示菜单时都会调用此菜单。您可以使用此方法有效地启用/禁用项目或以其他方式动态修改内容。

答案 1 :(得分:0)

答案非常简单:

private Menu menu; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigation);
    navigationView.setNavigationItemSelectedListener(this);

    menu = navigationView.getMenu();

...

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.nav_light) {
       if (canTorch) {
           try {
               if (isTorchOn) {
                   turnOffFlashLight();
                   isTorchOn = false;
                   menu.getItem(6).setIcon(getResources().getDrawable(R.mipmap.ic_flash_on_black_24dp));
               } else {
                   turnOnFlashLight();
                   isTorchOn = true;
                   menu.getItem(6).setIcon(getResources().getDrawable(R.mipmap.ic_flash_off_black_24dp));
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawerLayout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

全部是关于:menu = navigationView.getMenu();