titulo studio personalizar icono example desplegable cambiar boton bar agregar actionbar android

android - studio - Cómo cambiar el ícono de MenuItem en ActionBar programáticamente



navigation drawer (6)

En lugar de getViewById (), use

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

reemplazando el Menu.FIRST con la Menu.FIRST de su elemento de menú.

¿Cómo cambiar el ícono de MenuItem en ActionBar programmatically? Intenté usar

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

pero no funciona. Este es mi código:

Actividad principal

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>

Esta es la excepción que tuve después de ejecutar:

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)


Esto funciona para mí Debería estar en su elemento onOptionsItemSelected(MenuItem item) item.setIcon(R.drawable.your_icon); onOptionsItemSelected(MenuItem item) item.setIcon(R.drawable.your_icon);


La respuesta de Lalith es correcta.

También puedes probar este enfoque:

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


No puede usar findViewById () en elementos de menú en onCreate () porque el diseño del menú aún no está inflado. Puede crear una variable de menú global e inicializarla en onCreateOptionsMenu () y luego usarla en su onClick ().

private Menu menu;

En su onCreateOptionsMenu ()

this.menu = menu;

En el método onClick () de tu botón

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


Resolví este problema de esta manera:

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

en onOptionsItemSelected :

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


Esta funcionando

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