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