如何以编程方式更改ActionBar中的MenuItem图标

如何以编程方式更改ActionBar中的MenuItem图标? 我试图使用

MenuItem menuItem =(MenuItem)findViewById(R.id.action_settings); menuItem.setIcon(getResources()。getDrawable(R.drawable.ic_launcher))

但它不起作用。 这是我的代码:

主要活动

package com.test; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends ActionBarActivity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MenuItem menuItem = (MenuItem)findViewById(R.id.action_settings); menuItem.setIcon(getResources().getDrawable(R.drawable.ic_launcher)); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 

main.xml中

 <menu 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" tools:context=".MainActivity" > <item android:icon="@drawable/action_settings" android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" app:showAsAction="always"/> </menu> 

activity_main

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent"> <Button android:id="@+id/button" android:text="Set icon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

这是我运行后的例外情况:

 MenuItem menuItem = (MenuItem)findViewById(R.id.action_settings); 11-09 19:52:40.471 1735-1735/com.test E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.ClassCastException: android.support.v7.internal.view.menu.ActionMenuItemView at com.test.MainActivity$1.onClick(MainActivity.java:19) at android.view.View.performClick(View.java:2485) at android.view.View$PerformClick.run(View.java:9080) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) 

你不能在onCreate()的菜单项上使用findViewById(),因为菜单布局还没有膨胀。 你可以创build一个全局的Menuvariables,并在onCreateOptionsMenu()中初始化它,然后在你的onClick()中使用它。

 private Menu menu; 

在你的onCreateOptionsMenu()

 this.menu = menu; 

在你的button的onClick()方法

 menu.getItem(0).setIcon(ContextCompat.getDrawable(this, R.drawable.ic_launcher)); 

拉利思的回答是正确的。

你也可以尝试这种方法:

 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { invalidateOptionsMenu(); } }); @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem settingsItem = menu.findItem(R.id.action_settings); // set your desired icon here based on a flag if you like settingsItem.setIcon(getResources().getDrawable(R.drawable.ic_launcher)); return super.onPrepareOptionsMenu(menu); } 

我这样解决了这个问题:

onCreateOptionsMenu

 this.menu = menu; this.menu.add("calendar"); ImageView imageView = new ImageView(getActivity()); imageView.setMinimumHeight(128); imageView.setMinimumWidth(128); imageView.setImageDrawable(yourDrawable); MenuItem item = this.menu.getItem(0); item.setActionView(imageView); 

onOptionsItemSelected

 if (item.getOrder() == 0) { //TODO return true; } 

这对我有用。 它应该在你的onOptionsItemSelected(MenuItem item)方法item.setIcon(R.drawable.your_icon);

而不是getViewById(),使用

 MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST); 

用您的菜单项IDreplaceMenu.FIRST

它的工作

  MenuItem tourchmeMenuItem; // Declare Global ....... public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search, menu); menu.findItem(R.id.action_search).setVisible(false); tourchmeMenuItem = menu.findItem(R.id.done); return true; } public boolean onOptionsItemSelected(MenuItem item) { case R.id.done: if(LoginPreferences.getActiveInstance(CustomViewFinderScannerActivity.this).getIsFlashLight()){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mScannerView.setFlash(false); LoginPreferences.getActiveInstance(CustomViewFinderScannerActivity.this).setIsFlashLight(false); tourchmeMenuItem.setIcon(getResources().getDrawable(R.mipmap.torch_white_32)); } }else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mScannerView.setFlash(true); LoginPreferences.getActiveInstance(CustomViewFinderScannerActivity.this).setIsFlashLight(true); tourchmeMenuItem.setIcon(getResources().getDrawable(R.mipmap.torch_cross_white_32)); } } break; }