2013-11-09 5 views
75

प्रोग्रामबैक में MenuItem आइकन को कैसे बदलें? मैंनेएक्शनबार में menuItem आइकन को प्रोग्रामेटिक रूप से

मेनूइटम मेनू Item = (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

आप onrere() में मेनू आइटम्स पर findViewById() का उपयोग नहीं कर सकते हैं क्योंकि मेनू लेआउट अभी तक फुलाया नहीं गया है। आप एक वैश्विक मेनू चर बना सकते हैं और इसे onCreateOptionsMenu() में प्रारंभ कर सकते हैं और फिर इसे अपने ऑनक्लिक() में उपयोग कर सकते हैं।

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; 

} 
संबंधित मुद्दे