অ্যাকশনবারে আমি কীভাবে কোনও মেনু আইটেমটি আড়াল করব?


347

আমার একটি মেনুতেম সহ অ্যাকশন বার রয়েছে। আমি কীভাবে সেই মেনু আইটেমটি গোপন / প্রদর্শন করতে পারি?

এটি আমি যা করার চেষ্টা করছি:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();

উত্তর:


484

MenuItemজাতীয় আইটেমটির দিকে ইঙ্গিত করুন, setVisibleএর দৃশ্যমানতাটি সামঞ্জস্য করতে এটিতে কল করুন এবং তারপরে invalidateOptionsMenu()আপনার ক্রিয়াকলাপে কল করুন যাতে অ্যাকশনবার মেনু সেই অনুসারে সামঞ্জস্য হয়।

আপডেট:MenuItemকোনও নিয়মিত ভিউ নয় যা আপনার বিন্যাসের অংশ part এটি বিশেষ কিছু, সম্পূর্ণ আলাদা। আপনার কোডটি এর nullজন্য ফিরে আসে itemএবং এটি ক্র্যাশ ঘটায়। পরিবর্তে আপনার যা প্রয়োজন তা হ'ল:

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

এখানে যে ক্রমটি আপনাকে কল করা উচিত তা এখানে: প্রথম কল invalidateOptionsMenu()এবং তারপরে ভিতরে onCreateOptionsMenu(Menu)মেনুআইটেমের জন্য একটি রেফারেন্স পান ( menu.findItem()কল setVisible()করে ) এবং কল করুন


এটি আমি প্রাথমিকভাবে ভেবেছিলাম তবে এটি অ্যাপ্লিকেশনটিকে ক্র্যাশ করে।
জোল্টন

3
@ স্টার জোল্টন: আচ্ছা আপনি এটি কীভাবে করেন, অ্যাপ্লিকেশনটি ক্র্যাশ হয়ে গেলে আপনি এটি ভুল করছেন। উদাহরণস্বরূপ, আপনি এর পরিবর্তে ব্যবহার করছেন বলে আপনার MenuItemহতে পারে । আপনার কোড এবং ক্র্যাশ লগ উভয়ই না দেখে আমরা কখনই জানতে পারি না। nullgetItemfindItem
কে-বেলো

ঠিক আছে তবে আমি কীভাবে onCreateOptionsMenu পদ্ধতির বাইরের মেনুটির রেফারেন্স পেতে পারি?
জোল্টন আলোড়ন

7
@ স্টিয়ার জোল্টন: আমি বিশ্বাস করি আপনি শেষ মন্তব্যটি দিয়ে কোনও অর্থহীন হন না ... কেবলমাত্র আপনার মেনু আইটেমটির জন্য একটি রেফারেন্স পাবেন onCreateOptionsMenuএবং সেই সময়ে আইটেমটির দৃশ্যমানতা সেট করুন। অথবা রেফারেন্সটি যতক্ষণ না স্থির করে নিন যতক্ষণ না এটি স্থির করা উচিত কি না।
কে-বালো

33
আমি মনে করি যে (সর্বোত্তমভাবে) এই উত্তরটি খারাপভাবে বলা হয়েছে কারণ পদক্ষেপগুলির ক্রমটি ভুল। সঠিক ক্রমটি হ'ল প্রথমে কল করা invalidateOptionsMenu()এবং তারপরে ভিতরে ( কল করে ) onCreateOptionsMenu(Menu)একটি রেফারেন্স পান এবং এটি কল করে। উত্তর suhas_sm দ্বারা এবং P1r4nh4 দ্বারা সঠিক পদ্ধতির উপস্থাপন। MenuItemmenu.findItem()setVisible()
টেড হপ

163

এই প্রশ্নের একটি সংযোজন পেয়েছেন:

আপনি যদি যেতে যেতে আপনার মেনু আইটেমগুলির দৃশ্যমানতা পরিবর্তন করতে চান তবে আপনার মেনুটি invalidateOptionsMenu()আড়াল করতে এবং আপনার ওভাররাইড onCreateOptionsMenu(...)পদ্ধতিতে আইটেমগুলি কল করতে এবং আড়াল করতে চান তা মনে রাখতে আপনাকে কেবল আপনার ক্রিয়াকলাপে সদস্যের পরিবর্তনশীল সেট করতে হবে ।

//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == HIDE_MENU)
    {
        for (int i = 0; i < menu.size(); i++)
            menu.getItem(i).setVisible(false);
    }
}

আমার উদাহরণে আমি সমস্ত আইটেম লুকিয়ে রেখেছি।


2
এটি ঠিক আমি যা খুঁজছিলাম। মেনুআইটিমে ধরে রাখা এবং সেটভিজিবল () কল করা আমার প্রত্যাশিত কাজটি মনে হয় নি (সম্ভবত কারণ আমি অবৈধ অপশনমেনু () পরে কল করছিলাম, সুতরাং মেনুটি পুনর্নির্মাণ করছি), তবে যেভাবেই হোক - এটি ঠিক যেমনটি আমি প্রত্যাশা করছিলাম, ধন্যবাদ!
ম্যাট

4
আপনি যদি প্রতিটি আইটেম আড়াল করতে চলেছেন তবে একটি সহজ উপায় আছে। এখানে প্রতিটি আইটেমের লুপিংয়ের পরিবর্তে আপনি কেবল এটি করতে পারেন: if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }ডক্সটি বলে: "মেনুটি প্রদর্শিত হওয়ার জন্য আপনাকে অবশ্যই সত্যটি ফিরতে হবে; যদি আপনি মিথ্যা ফেরান তবে এটি প্রদর্শিত হবে না"।
w3bshark

এছাড়াও, আমি উল্লেখ করতে চাই যে এই পদ্ধতির গৃহীত উত্তরের চেয়ে অনেক বেশি পরিষ্কার। ভাগ করে নেওয়ার জন্য ধন্যবাদ!
w3bshark

অবৈধ অপশনমেনু () onCreateOptionMenu () কে ফোন করে আমি আমার শর্তাদি অনক্রিপশন অপশনমেনু () এ পরিচালনা করি। উত্তরের উত্তরের জন্য ধন্যবাদ
user1912026

onPrepareOptionsMenu()এর পরিবর্তে প্রদর্শন / আড়াল করার জন্য ব্যবহার করা উচিত onCreateOptionsMenu()কারণ এটি একবার ব্যবহার করা হয় যদি আপনি মেনু আইটেমগুলির আরম্ভের পরে পরিবর্তন করতে চান তবে এটি কার্যকর নয়। সুতরাং অনক্রিটে স্ফীত করুন, তবে অনপ্রেরে প্রদর্শন করুন / লুকান।
JCutting8

89

হ্যাঁ.

  1. আপনি একটি পতাকা / শর্ত সেট করতে পারেন।
  2. invalidateOptionsMenu()আপনি বিকল্পটি আড়াল করতে চাইলে কল করুন । এই কল করবেonCreateOptionsMenu()
  3. ইন onCreateOptionsMenu(), পতাকা / শর্তটি পরীক্ষা করুন এবং এটি নীচের উপায়ে দেখান বা আড়াল করুন:
MenuItem item = menu.findItem(R.id.menu_Done);

if (flag/condition)) {
  item.setVisible(false); 
} else { }

2
এর invalidateOptionsMenuপরিবর্তে হওয়া উচিত নয় invalidateOptions?
razz

3
আপনি যদি নিজের পতাকাটিকে বুলিয়ান করেন তবে প্রয়োজনে আইটেমটির দৃশ্যমানতা পতাকা (বা! পতাকা) এ সেট করতে পারেন। সুতরাং, আইটেম.সেটভিজিবিলিটি (! পতাকা); শর্ত না থাকলে এটিকে একটি ওলাইনার করে তোলে।
জোহরহেল

পরিবর্তনশীল "মেনু" সংজ্ঞায়িত হয় কোথায়?
জোনাথন

এটি প্যারামিটার হিসাবে পাস হয়েছেonCreateOptionsMenu
suhas_sm

এই পদ্ধতিটি ব্যবহার করার অর্থ আইটেমটি এখনও স্থান গ্রাস করবে এবং বোতামটি যেখানে হওয়া উচিত আপনার ইউআইতে আপনি "ফাঁক" দিয়ে শেষ করতে পারেন। অনপ্রিপার্পেশনমেনুতে মুছে ফেলা আইটেমটি ব্যবহার করা কৌশলটি করবে।
JCutting8

39

আপনি এই কল করতে পারেন:

MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);

হালনাগাদ:

নিশ্চিত করুন যে আপনার কোড নিয়ে এসেছে নেই করুন nullজন্য itemঅথবা এটি আবেদন বিপর্যস্ত হতে পারে।


এই পদ্ধতিটি ব্যবহার করার অর্থ আইটেমটি এখনও স্থান গ্রাস করবে এবং বোতামটি যেখানে হওয়া উচিত আপনার ইউআইতে আপনি "ফাঁক" দিয়ে শেষ করতে পারেন। অনপ্রিপার্পেশনমেনুতে মুছে ফেলা আইটেমটি ব্যবহার করা কৌশলটি করবে।
JCutting8

33

আমি আরও কিছু প্রসঙ্গে একটি উত্তর খুঁজছিলাম। এখন যেহেতু আমি এটি সন্ধান করেছি, আমি সেই উত্তরটি যুক্ত করব।

মেনু এক্সএমএলে ডিফল্টরূপে বোতামটি লুকান

ডিফল্টরূপে ভাগ বোতামটি গোপন করা হবে, যেমন সেট করা হয়েছে android:visible="false"

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

main_menu.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">

    <!-- hide share button by default -->
    <item
        android:id="@+id/menu_action_share"
        android:icon="@drawable/ic_share_white_24dp"
        android:visible="false"     
        android:title="Share"
        app:showAsAction="always"/>

    <item
        android:id="@+id/menu_action_settings"
        android:icon="@drawable/ic_settings_white_24dp"
        android:title="Setting"
        app:showAsAction="ifRoom"/>

</menu>

কোডে বোতামটি দেখান

তবে শেয়ারের বোতামটি কিছু শর্তের ভিত্তিতে optionচ্ছিকভাবে প্রদর্শিত হতে পারে।

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

MainActivity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem shareItem = menu.findItem(R.id.menu_action_share);

    // show the button when some condition is true
    if (someCondition) {        
        shareItem.setVisible(true);
    }

    return true;
}

আরো দেখুন


onPrepareOptionsMenu () onCreateOptionsMenu () এর পরিবর্তে লজিক প্রদর্শন / আড়াল করার জন্য ব্যবহার করা উচিত কারণ এটি কেবল একবার বলা হয় যদি আপনি মেনু আইটেমগুলির আরম্ভের পরে পরিবর্তন করতে চান তবে এটি দরকারী নয়। সুতরাং অনক্রিটে স্ফীত করুন, তবে অনপ্রেরে প্রদর্শন করুন / লুকান, তারপরে invalidateOptionsMenu()মেনুটি রিফ্রেশ করতে ব্যবহার করুন।
JCutting8

24

আমার জন্য কাজ করেনি। onPrepareOptionsMenuঅদৃশ্য আইটেম সেট করতে আমাকে স্পষ্টভাবে ব্যবহার করতে হয়েছিল।

সুতরাং onCreateOptionsMenuমেনু তৈরি করতে এবং onPrepareOptionsMenuদৃশ্যমানতা পরিবর্তন করতে ব্যবহার করুন etc.


1
আমার জন্য এটি উভয় উপায়ে কাজ করেছে, তবে অ্যান্ড্রয়েডের ডক্সের ভিত্তিতে onPrepareOptionsMenuএই ধরণের অপারেশন করার জন্য সঠিক জায়গা বলে মনে হচ্ছে: "স্ক্রিনের মানক বিকল্পগুলির মেনুটি প্রদর্শিত হতে প্রস্তুত করুন the মেনুটি প্রদর্শিত হওয়ার আগেই একে ডাকা হয়, প্রতিবার এটি প্রদর্শিত হয় "আপনি এই পদ্ধতিটি আইটেমগুলিকে দক্ষ / অক্ষম করতে বা অন্যথায় বিষয়বস্তুগুলিকে গতিশীল পরিবর্তন করতে ব্যবহার করতে পারেন।"
যুবাল

হ্যাঁ, এটি আদর্শ। onPrepareOptionsMenu () onCreateOptionsMenu () এর পরিবর্তে লজিক প্রদর্শন / আড়াল করার জন্য ব্যবহার করা উচিত কারণ এটি কেবল একবার বলা হয় যদি আপনি মেনু আইটেমগুলির আরম্ভের পরে পরিবর্তন করতে চান তবে এটি দরকারী নয়। সুতরাং অনক্রিটে স্ফীত করুন, তবে অনপ্রেরে প্রদর্শন করুন / লুকান, তারপরে invalidateOptionsMenu()মেনুটি রিফ্রেশ করতে ব্যবহার করুন।
JCutting8

9

প্রাথমিকভাবে মেনু আইটেমের দৃশ্যমানতাটিকে মেনু বিন্যাসের ফাইলটিতে মিথ্যা হিসাবে সেট করুন:

<?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:visible="false"
        android:id="@+id/action_do_something"
        android:title="@string/txt_do_something"
        app:showAsAction="always|withText"
        android:icon="@drawable/ic_done"/>
</menu>

তারপরে আপনি মেনুটি স্ফূরণ করার পরে মেনু আইটেমটির দৃশ্যমানতাটি আপনার onCreateOptionsMenu () এ মিথ্যাতে সেট করতে পারেন।

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(menu,R.menu.menu);
    MenuItem item = menu.findItem(R.id.menuItemId);
    if (item != null){
        item.setVisible(false);
    }
}

onCreateOptionsMenu একটি বুলিয়ান মান দেয় না। সমাধান যদিও নিখুঁতভাবে কাজ করে।
জোসেফ


7

এটি আমার জন্য ক্রিয়াকলাপ এবং খণ্ডন উভয় থেকেই কাজ করেছিল

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    if (menu.findItem(R.id.action_messages) != null)
        menu.findItem(R.id.action_messages).setVisible(false);
}

1
আমার ক্ষেত্রে প্রিপার্পেপশনস মেনু বুলিয়ান ফিরিয়ে দেয়, অকার্যকর নয়।
কুলমাইন্ড

6

P1r4nh4 উত্তরটি ঠিক কাজ করে, আমি কেবল এটি বুলিয়ান পতাকা ব্যবহার করে সরল করেছিলাম:

public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == 1) //1 is true, 0 is false
    {
        //hide only option 2
            menu.getItem(2).setVisible(false);
    }
}

2
ব্যবহার 0এবং 1এটি "বুলিয়ান পতাকা" নয়, এটি সিউডো-বুলিয়ান। তদ্ব্যতীত, এখানে একটি আসল বুলিয়ান ব্যবহার করার কোনও কারণ নেই।
ইনগো বার্ক

2
এছাড়াও, আপনার একাধিক রাজ্য থাকতে পারে, কেবল একটি লুকানোর জন্য নয় এবং একটি দেখানোর জন্য। আপনার অ্যাপ্লিকেশনটির জটিলতা এবং নতুন অ্যাপ্লিকেশনটির জন্য নতুন ক্রিয়াকলাপ লিখতে অস্বীকারের উপর নির্ভর করে আপনার মেনুর কিছু অংশ লুকিয়ে রাখতে চাইলে আপনার একটি SHOW_ALL রাজ্য, একটি HIDE_ALL রাজ্য, তবে একটি HIDE_EDIT বা HIDE_SHARE রাষ্ট্র থাকতে পারে Dep
P1r4nh4

4

অ্যান্ড্রয়েড বিকাশকারী অফিসিয়াল সাইট অনুসারে, রানটাইম এ মেনু আইটেম বা আইকন, দৃশ্যমানতা ... ইত্যাদি পরিবর্তনের জন্য অনক্রিয়েটঅপশনমেনু (মেনু মেনু) পুনরুদ্ধার করা হয় না।

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

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

রিকোমেন্ডেড হিসাবে আপনি এই অনপশন আইটেমসিলিগ্রেটেড (মেনু আইটেম আইটেম) পদ্ধতির ট্র্যাক ব্যবহারকারী ইনপুটগুলি ব্যবহার করতে পারেন ।

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.edit) {
        Intent intent = new Intent(this, ExampleActivity.class);
        intent.putExtra(BUNDLE_KEY, mConnection);
        startActivityForResult(intent, PICK_CHANGE_REQUEST);
        return true;
    } else if (id == R.id.delete) {
        showDialog(this);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

রান চলাকালীন আপনার যদি মেনু আইটেমগুলি পরিবর্তন করতে হয় তবে এগুলি পরিবর্তন করতে আপনি প্রিপার্পেপশনমেনু (মেনু মেনু) ব্যবহার করতে পারেন

@Override
public boolean onPrepareOptionsMenu(Menu menu){

    if (Utils.checkNetworkStatus(ExampleActivity.this)) {
        menu.findItem(R.id.edit).setVisible(true);
        menu.findItem(R.id.delete).setVisible(true);
    }else {
        menu.findItem(R.id.edit).setVisible(false);
        menu.findItem(R.id.delete).setVisible(false);
    }
    return true;
} 

কিছু আইটেম সর্বদা দৃশ্যমান থাকে, তাই আমি যখন setVisible(false)সর্বদা দৃশ্যমান আইটেমটির জন্য থাকি তখন আমি তিনটি বিন্দুর (মেনু নিজেই) ক্লিক না করা অবধি অদৃশ্য হয়ে যায় না। যদি আমি ব্যবহার invalidateOptionsMenu()মধ্যে onPrepareOptionsMenuআইটেম অবিলম্বে নিজেই পুনঃসংগঠিত, কিন্তু তারা তাদের কাজ আলগা (যদি আমি কোনো আইটেম উপর ক্লিক করুন, এটা কিছুই না)।
অ্যালিটন অলিভিরা

3

একটি ভেরিয়েবলের জন্য একটি মান সেট করুন এবং অকার্যকর কল করুন অধ্যায়গুলি মেনু ();

উদাহরণ স্বরূপ

    selectedid=arg2;
            invalidateOptionsMenu();


 public boolean onPrepareOptionsMenu(Menu menu) {

    if(selectedid==1){
        menu.findItem(R.id.action_setting).setVisible(false);
        menu.findItem(R.id.action_s2).setVisible(false);
        menu.findItem(R.id.action_s3).setVisible(false);
    }
    else{
        if(selectedid==2){
            menu.findItem(R.id.action_search).setVisible(false);
            menu.findItem(R.id.action_s4).setVisible(false);
            menu.findItem(R.id.action_s5).setVisible(false);
        }
    }
    return super.onPrepareOptionsMenu(menu);
}

কিছু আইটেম সর্বদা দৃশ্যমান থাকে, তাই আমি যখন setVisible(false)সর্বদা দৃশ্যমান আইটেমটির জন্য থাকি তখন আমি তিনটি বিন্দুর (মেনু নিজেই) ক্লিক না করা অবধি অদৃশ্য হয়ে যায় না। যদি আমি ব্যবহার invalidateOptionsMenu()মধ্যে onPrepareOptionsMenuআইটেম অবিলম্বে নিজেই পুনঃসংগঠিত, কিন্তু তারা তাদের কাজ আলগা (যদি আমি কোনো আইটেম উপর ক্লিক করুন, এটা কিছুই না)।
অ্যালিটন অলিভিরা

3

আপনি toolbar.getMenu().clear();একবারে সমস্ত মেনু আইটেম আড়াল করতে ব্যবহার করতে পারেন


@ অজিৎ_যাদব আপনি মেনুটি সাফ করার পরে দৃশ্যমান করার কোনও উপায় আছে?
শান

3

মেনুতে সমস্ত আইটেমের দৃশ্যমানতা সেট করার মাধ্যমে অ্যাপবার মেনু বা ওভারফ্লো মেনু স্বয়ংক্রিয়ভাবে লুকানো হবে

উদাহরণ

private Menu menu_change_language;

...

...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    ...
    ...
    menu_change_language = menu;
    menu_change_language.findItem(R.id.menu_change_language)
           .setVisible(true);

    return super.onCreateOptionsMenu(menu);
}

অন্যান্য খণ্ডে যাওয়ার আগে বেলো কোড ব্যবহার করুন:

if(menu_change_language != null){                 
    menu_change_language.findItem(R.id.menu_change_language)
       .setVisible(false);
}

2

https://stackoverflow.com/a/21215280/466363 - লুক আল্টার্নো এবং সুফিয়ান দ্বারা উত্তর

  • ক্রিয়াকলাপম্পট.অনুয়েডিয়েটপশনস মেনু () প্রিপার্পেপশনমেনু () এ কলব্যাক করে না; এটি কেবল মেনুটি সরাসরি আপডেট করে।
  • আমার সামুদে (), ক্রেইটঅপশনস মেনু () এর আগেও বেশ কয়েকটি জায়গা থেকে কল করা উচিত, তাই আমাকে অবশ্যই এমেনু পরীক্ষা করতে হবে! = নাল।
  • API 8 ব্যবহার করে কাজ করা উচিত

private Menu mMenu;
   @Override
   public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
       inflater.inflate(R.menu.track_fragment, menu);
       mMenu = menu;
       }
   ...
   private void someMethod() {
   ...
       if (mMenu != null) {
          MenuItem item = mMenu.findItem(R.id.new_track);
          if (item != null) {
               item.setVisible(false);
               ActivityCompat.invalidateOptionsMenu(this.getActivity());
           }
       }
   ...
   }
  • ক্রিয়াকলাপম্পট.অনুয়েডিয়েটপশনস মেনু () প্রিপার্পেপশনমেনু () এ কলব্যাক করে না; এটি কেবল মেনুটি সরাসরি আপডেট করে।

  • আমার সামুদে (), ক্রেইটঅপশনস মেনু () এর আগেও বেশ কয়েকটি জায়গা থেকে কল করা উচিত, তাই আমাকে অবশ্যই এমেনু পরীক্ষা করতে হবে! = নাল।

  • API 8 ব্যবহার করে কাজ করা উচিত

2

যদি আপনি উপরের উত্তরের মতো সব কিছু করেন তবে একটি মেনু আইটেমটি এখনও দৃশ্যমান হয়, আপনি অনন্য সংস্থানটির উল্লেখ করেছেন কিনা তা পরীক্ষা করে দেখুন। উদাহরণস্বরূপ, onCreateOptionsMenu বা onPrepareOptionsMenu এ

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    MenuItem menuOpen = menu.findItem(R.id.menu_open);
    menuOpen.setVisible(false);
}

Ctrl + ক্লিক করুন.আর.ইড.মেনু_পেন এবং এটি কেবল একটি মেনু ফাইলে বিদ্যমান। যদি এই সংস্থানটি ইতিমধ্যে যে কোনও জায়গায় ব্যবহার করা হয় এবং কোনও ক্রিয়াকলাপে লোড করা হয় তবে এটি সেখানে লুকানোর চেষ্টা করবে।


2

শুধুমাত্র একটি কমান্ড সহ একটি মেনুতে সমস্ত আইটেম আড়াল করার সর্বোত্তম উপায় হ'ল আপনার মেনুতে এক্সএমএলতে "গ্রুপ" ব্যবহার করা। একই গ্রুপের মধ্যে আপনার ওভারফ্লো মেনুতে থাকা সমস্ত মেনু আইটেমগুলি কেবল যুক্ত করুন।

এই উদাহরণে আমাদের কাছে দুটি মেনু আইটেম রয়েছে যা সর্বদা প্রদর্শিত হবে (নিয়মিত আইটেম এবং অনুসন্ধান) এবং তিনটি ওভারফ্লো আইটেম:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/someItemNotToHide1"
        android:title="ITEM"
        app:showAsAction="always" />

    <item
        android:id="@+id/someItemNotToHide2"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="Search"/>

    <group android:id="@+id/overFlowItemsToHide">
    <item android:id="@+id/someID" 
    android:orderInCategory="1" app:showAsAction="never" />
    <item android:id="@+id/someID2" 
    android:orderInCategory="1" app:showAsAction="never" />
    <item android:id="@+id/someID3" 
    android:orderInCategory="1" app:showAsAction="never" />
    </group>
</menu>

তারপরে, আপনার ক্রিয়াকলাপে (onCreateOptionsMenu এ পছন্দনীয়) কমান্ড সেটগ্রুপভিজিবল ব্যবহার করুন সমস্ত মেনু আইটেমের দৃশ্যমানতাটিকে মিথ্যা বা সত্য হিসাবে সেট করতে।

public boolean onCreateOptionsMenu(Menu menu) {
   menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}

আপনি যদি এই কমান্ডটি আপনার ক্রিয়াকলাপের অন্য কোথাও ব্যবহার করতে চান তবে মেনু ক্লাসটি স্থানীয়ভাবে সংরক্ষণ করার বিষয়ে নিশ্চিত হন এবং মেনুটি শূন্য রয়েছে কিনা তা সর্বদা যাচাই করুন, কারণ আপনি ক্রিয়েপশনমেনুর আগে কার্যকর করতে পারেন:

Menu menu;

public boolean onCreateOptionsMenu(Menu menu) {
       this.menu = menu;

}

public void hideMenus() {
       if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible       
}

1

যারা অ্যাপকম্প্যাট লাইব্রেরি ব্যবহার করছেন তাদের জন্য: আপনার ক্রিয়াকলাপটি যদি অ্যাকশনবার অ্যাক্টিভিটি সাবক্লাস হয় তবে আপনি সমর্থনআইডিয়োশনটিওপশনমেনু () কল করতে পারেন

এখানে দেখা হয়েছে: https://stackoverflow.com/a/19649877/1562524


1

আমি মনে করি মেনুটির জন্য সদস্য ভেরিয়েবলটি ব্যবহার করা, এটি onCreateOptionsMenu () এ আরম্ভ করুন এবং বিকল্পগুলির মেনুটিকে অকার্যকর করে কেবল পরে সেটভিজিবল () ব্যবহার করুন a


1

এই কোডটি আমার পক্ষে কাজ করেছিল

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu,menu);
    if (Application.sharedPreferences.getInt("type",1) == 2)
    {
        menuItem = menu.findItem(R.id.menu_travel_orders);
        menuItem.setVisible(false);
    }
    return super.onCreateOptionsMenu(menu);
}

1

এই পদ্ধতিটি আমার পক্ষে কাজ করেছে:

private  Menu thismenu;

if (condition)
{
   if(thismenu != null)
   {
       thismenu.findItem(R.id.menu_save).setVisible(true);
       Toast.makeText(ProfileActivity.this, 
    ""+thismenu.findItem(R.id.menu_save).getTitle(),
                Toast.LENGTH_SHORT).show();
   }else
   {
       thismenu.findItem(R.id.menu_save).setVisible(false);
   }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
   getMenuInflater().inflate(R.menu.profile_menu, menu);
   thismenu = menu;

   return true;
}

1

আপনি কোনও ক্রিয়াকলাপ থেকে একটি মেনু আইটেম অ্যাক্সেস করার চেষ্টা করছেন, যার সুযোগে অ্যাক্সেস নেই। মেনু আইটেমটি সন্ধানের জন্য কলটি বাতিল হবে , কারণ দৃশ্যটি আপনি যে কার্যকলাপটি বা কলটি দিয়ে যাচ্ছেন না বা সেই বিন্যাসের সাথেই আবদ্ধ নয় ।

মেনু আইটেমগুলিকে " নেভিগেশন বার " এর মতো আইটেমগুলি আবদ্ধ করা হয় যা পরিবর্তিতভাবে সংশ্লিষ্ট ক্রিয়াকলাপের সাথে আবদ্ধ হয়।

সুতরাং ক্রিয়াকলাপে () এ দর্শনগুলি আরম্ভ করুন এবং তারপরে সেই দর্শনগুলি সহ মেনু আইটেমগুলি অ্যাক্সেস করুন।

Navigation navView;
navView = findViewById(R.id.navigationView);

MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);

1

ব্যবহার invalidateOptionsMenu()

কল করার জন্য onPrepareOptionsMenu(menu: Menu?)

আপনার কেবলমাত্র প্রাথমিক মেনু অবস্থা তৈরি করতে এবং ক্রিয়াকলাপের জীবনচক্রের সময় পরিবর্তন না করার জন্য onCreateOptionsMenu () ব্যবহার করা উচিত ...

যখন কোনও ইভেন্ট দেখা দেয় এবং আপনি একটি মেনু আপডেট সম্পাদন করতে চান, আপনাকে অবশ্যই কম্পিউটারে প্রিপার্পেপশনমেনু () তে কল করার অনুরোধ করতে অবৈধ অপশনমেনু () কল করতে হবে।

https://developer.android.com/guide/topics/ui/menus


0

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

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater = menuInflater
    inflater.inflate(R.menu.main_menu, menu)
    val method = menu.findItem(R.id.menu_method)
    method.isVisible = false //if want to show set true
    return super.onCreateOptionsMenu(menu)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.