অ্যান্ড্রয়েড: কীভাবে / বোতাম ক্লিকের বিকল্প মেনু আইটেমটি অক্ষম করবেন?


127

আমি যখন ব্যবহার করছি onCreateOptionsMenuবা onOptionsItemSelectedপদ্ধতিগুলি ব্যবহার করি তখন আমি সহজেই এটি করতে পারি ।

তবে আমার স্ক্রিনে কোথাও একটি বোতাম আছে এবং সেই বোতামটি ক্লিক করার পরে, প্রসঙ্গ মেনু আইটেমগুলি সক্ষম / অক্ষম করা উচিত।

উত্তর:


272

যাইহোক, ডকুমেন্টেশন সমস্ত জিনিস কভার করে।

রানটাইমে মেনু আইটেম পরিবর্তন করা

ক্রিয়াকলাপটি তৈরি হয়ে গেলে onCreateOptionsMenu(), উপরে বর্ণিত পদ্ধতিটিকে কেবল একবার ডাকা হয়। Menuআপনার কার্যকলাপ বিনষ্ট না হওয়া অবধি সিস্টেমটি আপনাকে এই পদ্ধতিতে সংজ্ঞায়িত করা পুনরায় ব্যবহার করে । আপনি যদি বিকল্প মেনুটি তৈরির পরে যেকোন সময় পরিবর্তন করতে চান তবে আপনাকে অবশ্যই onPrepareOptionsMenu()পদ্ধতিটি ওভাররাইড করতে হবে । এটি মেনু অবজেক্টটিকে বর্তমানে বিদ্যমান হিসাবে এটি পাস করে। আপনি যদি আপনার অ্যাপ্লিকেশনটির বর্তমান অবস্থার উপর নির্ভর করে মেনু আইটেমগুলি সরাতে, যুক্ত করতে, অক্ষম করতে বা সক্ষম করতে চান তবে এটি দরকারী।

যেমন

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    if (isFinalized) {
        menu.getItem(1).setEnabled(false);
        // You can also use something like:
        // menu.findItem(R.id.example_foobar).setEnabled(false);
    }
    return true;
}

অ্যান্ড্রয়েড 3.0.০ এবং তার থেকেও বেশি, অ্যাকশন বারে মেনু আইটেমগুলি উপস্থাপন করা হলে বিকল্পগুলি মেনু সর্বদা উন্মুক্ত বলে বিবেচিত হয়। যখন কোনও ইভেন্ট ঘটে এবং আপনি একটি মেনু আপডেট সম্পাদন করতে চান, আপনাকে অবশ্যই invalidateOptionsMenu()সিস্টেম কল করার অনুরোধের জন্য কল করতে হবে onPrepareOptionsMenu()


2
setEnable()আপনি যখন এই মেনুটি টিপেন তখন কী হয় তা পরিবর্তিত হয় তবে এটি কীভাবে দেখায় তা পরিবর্তন করে না (অ্যান্ড্রয়েড বিকাশকারী কী হয়েছে?)। সুতরাং হয় শিরোনাম অক্ষম করা এবং পরিবর্তন করা স্পষ্ট হয় , বা কেবলমাত্র MenuItemঅদৃশ্য হয়ে যায়।
ভ্লাদ

19
দ্রুত পরামর্শ: falseমেনুটি পুরোপুরি অক্ষম করতে ফিরে আসুন।
বার্ট ফ্রেডারিচস

5
প্লাস-এপ্রেসওপেশনস এআইপি-র মন্তব্য মেনু স্পষ্টভাবে বলেছে: ডেরাইভিং ক্লাসগুলি সর্বদা (!) বেস বর্গ প্রয়োগের জন্য কল করা উচিত। আপনি সেখানে আপনার সুপার কল ভুলে গেছেন।
এজেন্টকনফফ


রান-টাইমে মেনু আইটেমের পূর্ণসংখ্যা আইডি যুক্ত করা যায় কীভাবে? আপনি কেবল নামেই এগুলি যুক্ত করতে পারেন।
আন্তোনিও সেস্তো

66

সমস্ত অ্যান্ড্রয়েড সংস্করণে, সহজতম উপায়: মেনু অ্যাকশন আইকনটিকে অক্ষম হিসাবে দেখানোর জন্য এটি ব্যবহার করুন এবং এটি ফাংশনটিকে অক্ষম হিসাবে তৈরি করুন:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    MenuItem item = menu.findItem(R.id.menu_my_item);

    if (myItemShouldBeEnabled) {
        item.setEnabled(true);
        item.getIcon().setAlpha(255);
    } else {
        // disabled
        item.setEnabled(false);
        item.getIcon().setAlpha(130);
    }
}

1
আপনি যখন মিথ্যাতে দৃশ্যমানতা নির্ধারণ করতে পারবেন তখন কেন আলফা সেট করবেন?
এমএলপ্রোগ্রামার-সিআইএম

8
আমি 0 তে আলফা সেট করছি না, তবে 130 এ করছি
ফ্র্যাঙ্ক

8
বোতামের প্রসঙ্গে নির্ভর করে। বোতামটি সাধারণভাবে পরিবেশন করা বৈশিষ্ট্যটি যদি বর্তমান অবস্থায় সম্পূর্ণ অপ্রয়োজনীয় হয়, তবে হ্যাঁ দৃশ্যমানতা অদৃশ্য / অদৃশ্য হওয়া উচিত। তবে বৈশিষ্ট্যটি যদি বোতামটি সাধারণভাবে পরিবেশন করে তবে যে কোনও কারণের কারণে এটি ব্যবহারযোগ্য হবে (যেমন, ব্যবহারকারী যদি প্রিমিয়াম সদস্য হন, যদি ব্যবহারকারী সাইন ইন করে, যদি ব্যবহারকারী ইন্টারনেটের সাথে সংযুক্ত হয়, ইত্যাদি) তবে এটি গ্রেভ করে আউট করা ভাল nice কারণ তারপরে এটি ব্যবহারকারীকে জানতে দেয় যে এখানে কিছু বিদ্যমান বৈশিষ্ট্য রয়েছে যার কোনও কারণে তাদের অ্যাক্সেস নেই।
ইয়াতি

6
অদৃশ্য হিসাবে আইকন সেট করা প্রায় সমস্ত ব্যবহার ক্ষেত্রে ভাল। আপনি যদি একটি গোষ্ঠী রাখেন তবে তারা আরও ভাল অবস্থানে থাকতে পারে এবং গ্রেড আউট ব্যবহারকারীকে বোঝায় যে একটি বিকল্প প্রোগ্রাম রয়েছে যা একটি নির্দিষ্ট প্রোগ্রামের অবস্থায় সক্ষম হতে পারে in অদৃশ্য এবং অদৃশ্য জিনিস তৈরি করা এবং সম্ভবত লেআউট পরিবর্তনের কারণ খুব মূর্খ। বেশিরভাগ মেনু ধূসর আইটেম রয়েছে এবং মোডের উপর নির্ভর করে এগুলি অপসারণ না করার একটি কারণ রয়েছে।
রিচি এইচএইচ

1
মেনুতে আইকন না থাকলে কীভাবে? আপনি আলফা () সেট করতে পারবেন না।
লতিফ আনোয়ার

42

বিকল্প মেনু তৈরি করার সময় আপনি আইটেমটি পরিবর্তনশীল হিসাবে সংরক্ষণ করতে পারেন এবং তারপরে ইচ্ছামত এর বৈশিষ্ট্যগুলি পরিবর্তন করতে পারেন।

private MenuItem securedConnection;
private MenuItem insecuredConnection;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.connect_menu, menu);
    securedConnection = menu.getItem(0);
    insecuredConnection =  menu.getItem(1);
    return true;
}

public void foo(){
       securedConnection.setEnabled(true);
}    

এটি কোনও অ্যান্ড্রয়েড সংস্করণে সঠিক প্রতিক্রিয়া। বৈধতাযুক্ত প্রতিক্রিয়া কেবল এপিআই 11> ডিভাইসের জন্য বৈধ।
মার্কো এইচসি

2
আমি এটি চেষ্টা করেছি, এবং এটি কাজ করে না। মানে onPrepareOptionsMenu?
ক্রিস্টোফার পিক্সলে


4

কোনও এসিঙ্কটাস্ক হয়ে গেলে আইটেমগুলি সক্ষম বা অক্ষম করার জন্য কীভাবে বর্তমান মেনুটি আপডেট করবেন।

আমার অ্যাসিঙ্কটাস্ক ডেটা লোড করার সময় আমার ব্যবহারের ক্ষেত্রে আমার মেনুটি অক্ষম করা দরকার ছিল, তারপরে সমস্ত ডেটা লোড করার পরে, ব্যবহারকারীকে এটির ব্যবহার করার জন্য আমাকে আবার সমস্ত মেনু সক্ষম করতে হবে।

এটি অ্যাপ্লিকেশনটিকে ডেটা লোড করার সময় মেনু আইটেমগুলিতে ক্লিক করতে দেয়।

প্রথমে, আমি একটি রাজ্য ভেরিয়েবল ঘোষণা করি, ভেরিয়েবল 0 হলে মেনু প্রদর্শিত হয়, যদি সেই ভেরিয়েবল 1 হয় তবে মেনুটি লুকানো থাকে।

private mMenuState = 1; //I initialize it on 1 since I need all elements to be hidden when my activity starts loading.

তারপরে আমার onCreateOptionsMenu()এই ভেরিয়েবলটির জন্য আমি যাচাই করি, যদি এটি 1 হয় তবে আমি আমার সমস্ত আইটেম অক্ষম করি, যদি না হয় তবে আমি কেবল সেগুলি সব দেখাই

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_galeria_pictos, menu);

        if(mMenuState==1){
            for (int i = 0; i < menu.size(); i++) {
                menu.getItem(i).setVisible(false);
            }
        }else{
             for (int i = 0; i < menu.size(); i++) {
                menu.getItem(i).setVisible(true);
            }
        }

        return super.onCreateOptionsMenu(menu);
    }

এখন, যখন আমার ক্রিয়াকলাপ শুরু onCreateOptionsMenu()হবে, কেবল একবার কল হবে এবং আমার সমস্ত আইটেম চলে যাবে কারণ আমি তাদের শুরুতে রাজ্য সেট আপ করেছি।

তারপরে আমি একটি অ্যাসিঙ্কটাস্ক তৈরি করি যেখানে আমি সেই স্থানে আমার চলকটি 0 এ সেট করে onPostExecute()

এই ধাপে খুবই গুরুত্বপূর্ণ!

আপনি যখন কল invalidateOptionsMenu();করবেন তখন এটি আবার চালু হবেonCreateOptionsMenu();

সুতরাং, আমার রাজ্যটি 0-এ সেট করার পরে, আমি কেবলমাত্র সমস্ত মেনু পুনরায় আঁকলাম তবে এবার 0 এ আমার চলকটি দিয়ে বলা হয়েছে, সমস্ত অ্যাসিঙ্ক্রোনাস প্রক্রিয়া সম্পন্ন হওয়ার পরে সমস্ত মেনু প্রদর্শিত হবে এবং তারপরে আমার ব্যবহারকারী মেনুটি ব্যবহার করতে পারবেন ।

 public class LoadMyGroups extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mMenuState = 1; //you can set here the state of the menu too if you dont want to initialize it at global declaration. 

        }

        @Override
        protected Void doInBackground(Void... voids) {
           //Background work

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            mMenuState=0; //We change the state and relaunch onCreateOptionsMenu
            invalidateOptionsMenu(); //Relaunch onCreateOptionsMenu

        }
    }

ফলাফল

এখানে চিত্র বর্ণনা লিখুন


2

আপনি যখন নেভিগেশন ড্রয়ারে সঞ্চালন করবেন তখন সেরা সমাধান

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        menu.setGroupVisible(0,false);
        return true;
    }

এটি পুরো মেনুটি লুকিয়ে রাখে এবং এটি আবার খুলতে অসম্ভব করে তোলে
MrStahlfelge

2

একটি পুরানো প্রশ্নের আরও আধুনিক উত্তর:

MainActivity.kt

private var myMenuIconEnabled by Delegates.observable(true) { _, old, new ->
    if (new != old) invalidateOptionsMenu()
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    findViewById<Button>(R.id.my_button).setOnClickListener { myMenuIconEnabled = false }
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main_activity, menu)
    return super.onCreateOptionsMenu(menu)
}

override fun onPrepareOptionsMenu(menu: Menu): Boolean {
    menu.findItem(R.id.action_my_action).isEnabled = myMenuIconEnabled
    return super.onPrepareOptionsMenu(menu)
}

menu_main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/action_my_action"
    android:icon="@drawable/ic_my_icon_24dp"
    app:iconTint="@drawable/menu_item_icon_selector"
    android:title="My title"
    app:showAsAction="always" />
</menu>

menu_item_icon_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?enabledMenuIconColor" android:state_enabled="true" />
<item android:color="?disabledMenuIconColor" />

attrs.xml

<resources>   
    <attr name="enabledMenuIconColor" format="reference|color"/>
    <attr name="disabledMenuIconColor" format="reference|color"/>
</resources>

styles.xml or themes.xml

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="disabledMenuIconColor">@color/white_30_alpha</item>
    <item name="enabledMenuIconColor">@android:color/white</item>

দুর্দান্ত অ্যাপ্লিকেশন যা অনেকগুলি বয়লারপ্লেট ছাড়াই অ্যাপের চারপাশে ব্যবহার করা যেতে পারে।
আর্থার

আপনার কি সমস্যা হচ্ছে?
এক্সপ্রেসিবিবেলি

@ ব্যয়বহুলটি কেবলমাত্র জনসাধারণের বিজ্ঞপ্তি অনুসারে সমস্যা নয়।
বড় ম্যাকলার্জহিউজ

1
  @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            switch (item.getItemId()) {

                case R.id.item_id:

                       //Your Code....

                        item.setEnabled(false);
                        break;
              }
            return super.onOptionsItemSelected(item);
     }

পর্যালোচনা থেকে: হাই, দয়া করে কেবল উত্স কোড দিয়ে উত্তর দিবেন না। আপনার সমাধান কীভাবে কাজ করে সে সম্পর্কে একটি দুর্দান্ত বর্ণনা দেওয়ার চেষ্টা করুন। দেখুন: আমি কীভাবে ভাল উত্তর লিখব? । ধন্যবাদ
সানুন ןɐ কিউপি

1

আমি কি করেনি মেনু একটি রেফারেন্স সংরক্ষণ ছিল onCreateOptionsMenu। এটি প্রতিটি পৃথক আইটেম সংরক্ষণ করার পরিবর্তে নীরের উত্তরের মতো, আমি পুরো মেনুটি সংরক্ষণ করেছিলাম।

একটি মেনু ঘোষণা করুন Menu toolbarMenu;

তারপরে onCreateOptionsMenuমেনুটিকে আপনার ভেরিয়েবলে সংরক্ষণ করুন

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.main_menu, menu);
    toolbarMenu = menu;
    return true;
}

এখন আপনি যে কোনও সময় আপনার মেনু এবং এর সমস্ত আইটেম অ্যাক্সেস করতে পারেন। toolbarMenu.getItem(0).setEnabled(false);


0
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    // getMenuInflater().inflate(R.menu.home, menu);
    return false;
}

2
যদিও এই কোডটি ওপি-র প্রশ্নের উত্তর দিতে পারে, তত্পরতার কয়েকটি শব্দ বর্তমান এবং ভবিষ্যতের ব্যবহারকারীদের আপনার প্রতিক্রিয়া আরও ভালভাবে বুঝতে সহায়তা করবে।
থম

0

যদি দৃশ্যমান মেনু

menu.findItem(R.id.id_name).setVisible(true);

মেনু হাইড করুন

menu.findItem(R.id.id_name).setVisible(false);

-4

রানটাইমের সময় সাধারণত আপনার দর্শনগুলির বৈশিষ্ট্যগুলি পরিবর্তন করতে পারে:

(Button) item = (Button) findViewById(R.id.idBut);

এবং তারপর...

item.setVisibility(false)

কিন্তু

যদি আপনি কনটেক্সটেনু থেকে বিকল্পগুলির ডি দৃশ্যমানতাটি পরিবর্তন করতে চান, আপনার বোতাম টিপুন, আপনি একটি পতাকা সক্রিয় করতে পারেন এবং তারপরে অনক্রিটকন্টেক্সটেনুতে আপনি এর মতো কিছু করতে পারেন:

 @Override
        public void onCreateContextMenu(ContextMenu menu, 
                View v,ContextMenu.ContextMenuInfo menuInfo) {

            super.onCreateContextMenu(menu, v, menuInfo);

                menu.setHeaderTitle(R.string.context_title);

                if (flagIsOn()) {
                    addMenuItem(menu, "Option available", true);
                } else {
                    Toast.makeText(this, "Option not available", 500).show();
                }

        }

আশা করি এটা কাজে লাগবে


আমার অবশ্যই বলতে হবে আপনি ভুল হয়ে যাচ্ছেন, আমি চাই মেনু আইটেমটি অক্ষম করা উচিত, বোতামটি নয়।
বিকাশ

আমার উত্তর শেষ হয়েছে। এই কোডটি এটি কাজ করে, আমি আমার প্রকল্পগুলিতে ব্যবহার করেছি
এরিক

1
কাজের জন্য ধন্যবাদ, তবে আপনার প্রশ্নটি সঠিকভাবে পড়া উচিত যা আমি ইতিমধ্যে জানিয়েছি যে আমি এটি onCreateContextMenuপদ্ধতিতে পরিবর্তন করতে পারি । তবে আমি এই পদ্ধতি থেকে প্রসঙ্গে মেনুটি অ্যাক্সেস করতে চাই।
বিকাশ

onCreateContextMenuকেবল একবার কল করা হবে, তবে মেনু আইটেমটি সক্ষম / অক্ষম করতে আমি প্রচুর সময় বোতামে ক্লিক করতে পারি।
বিকাশ

হ্যাঁ, তবে প্রসঙ্গ মেনুটি সাধারণত লুকানো থাকে। আপনি যদি আপনার 'কোথাও বোতাম' টিপেন এবং পতাকাটি আমি যেমন বলেছি সেট করে, এই প্রসঙ্গ মেনুটি দৃশ্যমান নয় এবং পরের বার আপনি আপনার প্রসঙ্গ মেনুটি পুনরায় লোড করুন, এই বিকল্পটি অদৃশ্য হবে। অন্য বিকল্পটি হ'ল অন্য পদ্ধতিগুলির সাথে ইভেন্টগুলি পরিচালনা করতে একই চেহারা সহ অন্য ধরণের মেনু করা।
এরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.