Comment modifier l’icône MenuItem dans ActionBar par programme

Comment modifier l’icône MenuItem dans ActionBar par programme? J’ai essayé d’utiliser

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

mais ça ne marche pas. Ceci est mon code:

Activité principale

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

    

activité_main

  

C’est l’exception que j’ai eu après l’exécution:

 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) 

Vous ne pouvez pas utiliser findViewById () sur les éléments de menu dans onCreate () car la disposition du menu n’est pas encore gonflée. Vous pouvez créer une variable Menu globale et l’initialiser dans onCreateOptionsMenu (), puis l’utiliser dans votre onClick ().

 private Menu menu; 

Dans votre onCreateOptionsMenu ()

 this.menu = menu; 

Dans la méthode onClick () de votre bouton

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

La réponse de Lalith est correcte.

Vous pouvez également essayer cette approche:

 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); } 

J’ai résolu ce problème de cette façon:

Dans 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); 

dans onOptionsItemSelected :

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

Cela fonctionne pour moi. Il devrait être dans votre onOptionsItemSelected(MenuItem item) item.setIcon(R.drawable.your_icon);

Au lieu de getViewById (), utilisez

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

remplacer le Menu.FIRST par votre identifiant de menu.

à utiliser dans onMenuItemClick(MenuItem item) suffit de faire invalidateOptionsMenu(); item.setIcon(ContextCompat.getDrawable(this, R.drawable.ic_baseline_play_circle_outline_24px)); invalidateOptionsMenu(); item.setIcon(ContextCompat.getDrawable(this, R.drawable.ic_baseline_play_circle_outline_24px));

Ça marche

  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; }