2013-11-09 4 views
75

Как изменить значок MenuItem в ActionBar программно? Я попытался использоватьКак изменить значок MenuItem в ActionBar программно

Меню MenuItemItem = (MenuItem) findViewById (R.id.action_settings); menuItem.setIcon (GetResources(). GetDrawable (R.drawable.ic_launcher))

, но он не работает. Это мой код:

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> 

Это исключение, которое я имел после запуска:

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) 

ответ

185

Вы не можете использовать findViewById() для пунктов меню в onCreate(), потому что макет меню еще не завышен. Вы можете создать глобальную переменную Menu и инициализировать ее в onCreateOptionsMenu(), а затем использовать ее в своем onClick().

private Menu menu; 

В вашем onCreateOptionsMenu()

this.menu = menu; 

В OnClick вашей баттона метод()

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

насчет во фрагменте, где нет onCreateOptionsMenu()? – AlleyOOP

+0

Вероятно, вам нужно вызвать метод в своей деятельности из вашего фрагмента –

+0

@LalithMohan, я пробовал то же самое, но он не работает. Я мог бы изменить цвет шрифта заголовка элемента меню, я не могу изменить значок. Я разместил свой вопрос здесь: http://stackoverflow.com/questions/36716450/setting-icons-to-the-menu-items –

3

Я решил эту проблему таким образом:

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

ответ Лалитх является правильным.

Вы также можете попробовать этот подход:

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

Вместо getViewById(), используйте

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

замена Menu.FIRST с пунктом меню ид.

2

Это работает для меня. Это должно быть в вашем onOptionsItemSelected(MenuItem item) методы item.setIcon(R.drawable.your_icon);

-1

Его Рабочей

 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; 

} 
Смежные вопросы