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


121

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

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

लेकिन यह काम नहीं करता है। यह मेरा कोड है:

मुख्य गतिविधि

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)

जवाबों:


255

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

private Menu menu;

अपने onCreateOptionsMenu () में

this.menu = menu;

अपने बटन के ऑनक्लिक () विधि में

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

एक टुकड़े के बारे में क्या, जहां कोई onCreateOptionsMenu () नहीं है?
एलेओओप

आपको संभवतः अपने फ्रैगमेंट से अपनी गतिविधि पर एक विधि को कॉल करने की आवश्यकता है
ललित मोहन

@ ललितमोहन, मैंने भी यही कोशिश की थी, लेकिन यह काम नहीं करता। हालांकि मैं मेनू-आइटम के शीर्षक के फ़ॉन्ट रंग को बदल सकता था, मैं आइकन को बदलने में असमर्थ हूं। मैंने अपना प्रश्न यहाँ पोस्ट किया है: stackoverflow.com/questions/36716450/…
अखेश्वर झा

1
मुझे "getDrawable () पदावनत" त्रुटि संदेश मिला है। संभावित समाधान इस धागे में हैं: stackoverflow.com/questions/29041027/…
एलेक्सी

getDrawable को पदावनत कर दिया जाता है। किसी को भी एक नया समाधान मिला?
सोलो

46

ललित का जवाब सही है।

आप इस दृष्टिकोण को भी आजमा सकते हैं:

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(ContextCompat.getDrawable(this, R.drawable.ic_launcher)); 

    return super.onPrepareOptionsMenu(menu);
 }

इसे करने का यही तरीका है। +1
20

8

यह मेरे लिए काम करता है। यह आपकी onOptionsItemSelected(MenuItem item)विधि में होना चाहिएitem.setIcon(R.drawable.your_icon);


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

3

GetViewById () के बजाय, का उपयोग करें

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

Menu.FIRSTअपने मेनू आइटम आईडी के साथ बदल रहा है ।


3

यहाँ है कि मैं यह कैसे हल किया है:

1 - एक फ़ील्ड परिवर्तनीय बनाएँ जैसे: private Menu mMenuItem;

2 - विधि को ओवरराइड करें अमान्य करेंमेन्‍यू ():

@Override
public void invalidateOptionsMenu() {
    super.invalidateOptionsMenu();
}

3 - invalidateOptionsMenu()अपने में विधि को बुलाओonCreate()

4 - mMenuItem = menuअपने onCreateOptionsMenu(Menu menu)इस तरह से जोड़ें :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.webview_menu, menu);
    mMenuItem = menu;
    return super.onCreateOptionsMenu(menu);
}

5 - विधि में onOptionsItemSelected(MenuItem item)आप इस तरह से आइकन को बदलना चाहते हैं:

 @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){

        case R.id.R.id.action_settings:
            mMenuItem.getItem(0).setIcon(R.drawable.ic_launcher); // to change the fav icon
            //Toast.makeText(this, " " + mMenuItem.getItem(0).getTitle(), Toast.LENGTH_SHORT).show(); <<--- this to check if the item in the index 0 is the one you are looking for
            return true;
    }
    return super.onOptionsItemSelected(item);
}

0

onMenuItemClick(MenuItem item) बस करने में उपयोग करने के लिएinvalidateOptionsMenu(); item.setIcon(ContextCompat.getDrawable(this, R.drawable.ic_baseline_play_circle_outline_24px));


0

कोटलिन संस्करण:

toolbar.menu.findItem(R.id.notification).icon =
                    ContextCompat.getDrawable(requireContext(), R.drawable.ic_notification)

toolbar.menu.findItem(R.id.notification).isVisible = true

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

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.