2013-11-09 12 views
75

Come modificare l'icona MenuItem in ActionBar a livello di codice? Ho provato a utilizzareCome modificare l'icona MenuItem in ActionBar a livello di programmazione

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

ma non funziona. Questo è il mio codice:

MainActivity

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> 

questa è l'eccezione che ho avuto dopo l'esecuzione:

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) 

risposta

185

Non è possibile utilizzare findViewById() sulle voci di menu in onCreate() perché il layout del menu non è ancora gonfiato. È possibile creare una variabile Menu globale e inizializzarla in onCreateOptionsMenu() e quindi utilizzarla nel proprio onClick().

private Menu menu; 

Nella tua onCreateOptionsMenu()

this.menu = menu; 

In onClick del pulsante di metodo()

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

che dire in un frammento, dove non c'è onCreateOptionsMenu()? – AlleyOOP

+0

Probabilmente hai bisogno di chiamare un metodo sulla tua attività dal tuo frammento –

+0

@LalithMohan, ho provato la stessa cosa, ma non funziona. Potrei però cambiare il colore del carattere del titolo della voce di menu, non sono in grado di cambiare l'icona. Ho postato la mia domanda qui: http://stackoverflow.com/questions/36716450/setting-icons-to-the-menu-items –

3

Ho risolto questo problema in questo modo:

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

in onOptionsItemSelected:

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

risposta di Lalith è corretto.

Si può anche provare questo approccio:

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

Invece di getViewById(), utilizzare

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

sostituendo il Menu.FIRST con la voce di menu ID.

2

Questo funziona per me. Dovrebbe essere nel metodo onOptionsItemSelected(MenuItem item)item.setIcon(R.drawable.your_icon);

-1

Il suo lavoro

 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; 

} 
Problemi correlati