it-swarm.asia

كيف يمكنني إخفاء عنصر قائمة في شريط الإجراءات؟

لدي شريط عمل مع menuitem. كيف يمكنني إخفاء/إظهار عنصر القائمة هذا؟

هذا ما أحاول القيام به:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
304
Stir Zoltán

احصل على MenuItem للإشارة إلى مثل هذا العنصر ، واتصل بـ setVisible عليه لضبط رؤيته ثم اتصل بـ invalidateOptionsMenu() في نشاطك بحيث يتم ضبط قائمة ActionBar وفقًا لذلك.

التحديث: A MenuItem ليست طريقة عرض منتظمة تشكل جزءًا من التصميم الخاص بك. إنه شيء مميز ومختلف تمامًا. تقوم التعليمة البرمجية بإرجاع null لـ item وهذا يسبب التعطل. ما تحتاجه بدلاً من ذلك هو القيام بما يلي:

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

إليك التسلسل الذي يجب الاتصال به: أول مكالمة invalidateOptionsMenu() ثم داخل onCreateOptionsMenu(Menu) ، يمكنك الحصول على مرجع إلى MenuItem (عن طريق الاتصال menu.findItem()) والاتصال setVisible() عليه

442
K-ballo

وجدت ملحق لهذا السؤال:

إذا كنت ترغب في تغيير مستوى رؤية عناصر القائمة الخاصة بك أثناء التنقل ، فأنت بحاجة فقط إلى تعيين متغير عضو في نشاطك لتتذكر أنك تريد إخفاء القائمة والاتصال بـ 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);
    }
}

في مثالي ، قمت بإخفاء كل العناصر.

146
P1r4nh4

نعم فعلا.

  1. يمكنك ضبط العلم/الشرط.
  2. اتصل بـ invalidateOptionsMenu() عندما تريد إخفاء الخيار. هذا سوف ندعو onCreateOptionsMenu().
  3. في onCreateOptionsMenu() ، تحقق من العلم/الحالة وأظهرها أو أخفيها بالطريقة التالية:
MenuItem item = menu.findItem(R.id.menu_Done);

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

يمكنك الاتصال بهذا:

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

تحديث:

تأكد من أن الكود لا يُرجع null لـ item أو قد يعطل التطبيق.

37
elias

كنت أبحث عن إجابة مع سياق أكثر بقليل. الآن وقد اكتشفت ذلك ، سأضيف هذا الجواب.

إخفاء الزر بشكل افتراضي في القائمة xml

بشكل افتراضي ، سيتم إخفاء زر المشاركة ، كما هو محدد بواسطة Android:visible="false".

 enter image description here

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>

عرض زر في الرمز

ولكن يمكن اختياريا أن تظهر زر المشاركة على أساس بعض الشرط.

 enter image description here

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

أنظر أيضا

28
Suragch

لم يعمل لي. اضطررت إلى استخدام onPrepareOptionsMenu صراحة لتعيين عنصر غير مرئي.

لذا استخدم onCreateOptionsMenu لإنشاء القائمة و onPrepareOptionsMenu لتغيير الرؤية وما إلى ذلك.

23
hotzen

هذا عملت لي من كل من النشاط وشظية

@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);
}
7
Bala Vishnu

في البداية قم بتعيين رؤية عنصر القائمة على خطأ في ملف تخطيط القائمة على النحو التالي:

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

يمكنك بعد ذلك ببساطة ضبط رؤية عنصر القائمة على false في 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);
    }
}
7
Akhila

إجابة 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);
    }
}
6
Hiram

يمكنك استخدام toolbar.getMenu().clear(); لإخفاء جميع عناصر القائمة في وقت واحد

3
Ajeet Yadav

من خلال تعيين إمكانية رؤية جميع العناصر في القائمة ، سيتم إخفاء قائمة شريط التطبيق أو قائمة الفائض تلقائيًا

مثال

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);
}
3
Hantash Nadeem

عيّن قيمة إلى متغير واتصل invalidateOptionsMenu () ؛

فمثلا

    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);
}
3
zacharia

وفقًا لموقع Android Developer Official ، فإن OnCreateOptionMenu (قائمة القائمة) غير موصى به لتغيير عناصر القائمة أو الرموز والرؤية..إلخ في وقت التشغيل.

بعد قيام النظام باستدعاء onCreateOptionsMenu () ، يحتفظ بمثيل من القائمة التي يملأها ولن يقوم باستدعاء onCreateOptionsMenu () مرة أخرى ما لم يتم إبطال القائمة لسبب ما. ومع ذلك ، يجب عليك استخدام onCreateOptionsMenu () فقط لإنشاء حالة القائمة الأولية وليس لإجراء تغييرات أثناء دورة حياة النشاط.

إذا كنت ترغب في تعديل قائمة الخيارات بناءً على الأحداث التي تحدث أثناء دورة حياة النشاط ، يمكنك القيام بذلك في طريقة onPrepareOptionsMenu (). تقوم هذه الطريقة بتمرير كائن القائمة كما هو موجود حاليًا حتى تتمكن من تعديله ، مثل إضافة عناصر أو إزالتها أو تعطيلها. (توفر الشظايا أيضًا رد اتصال onPrepareOptionsMenu ()./ - موقع AndroidDeveloper الرسمي -

كما هو موصى به ، يمكنك استخدام هذا onOptionsItemSelected (عنصر MenuItem) طريقة تتبع مدخلات المستخدم.

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

إذا كنت بحاجة إلى تغيير عناصر القائمة في وقت التشغيل ، يمكنك استخدام onPrepareOptionsMenu (قائمة القائمة) لتغييرها

@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;
} 
3
S.D.N Chanaka Fernando

https://stackoverflow.com/a/21215280/466363 - تم الرد عليه بواسطة Look Alterno و Sufian

  • ActivityCompat.invalidateOptionsMenu () لا يقوم باستدعاء onPrepareOptionsMenu ()؛ انها مجرد تحديث القائمة مباشرة.
  • اتصل بي someMethod () من عدة أماكن ، حتى قبل onCreateOptionsMenu () ، لذلك يجب التحقق من mMenu! = خالية.
  • يجب أن تعمل باستخدام 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());
           }
       }
   ...
   }
  • ActivityCompat.invalidateOptionsMenu () لا يقوم باستدعاء onPrepareOptionsMenu ()؛ انها مجرد تحديث القائمة مباشرة.

  • اتصل بي someMethod () من عدة أماكن ، حتى قبل onCreateOptionsMenu () ، لذلك يجب التحقق من mMenu! = خالية.

  • يجب أن تعمل باستخدام API 8
2
Shimon Doodkin

إذا كنت قد فعلت كل شيء كما هو مذكور في الإجابات أعلاه ، ولكن عنصر القائمة ما زال مرئيًا ، فتحقق من الرجوع إلى فريد المورد. على سبيل المثال ، في onCreateOptionsMenu أو onPrepareOptionsMenu

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

Ctrl + انقر فوق R.id.menu_open وتحقق من وجوده في ملف قائمة واحد فقط. في حالة استخدام هذا المورد بالفعل في أي مكان وتحميله في أحد الأنشطة ، فسيحاول إخفاءه.

2
CoolMind

جرب هذا:

MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
2
mohamad sheikhi

أعتقد أن الطريقة الأفضل تتمثل في استخدام متغير عضو للقائمة ، وتهيئته في onCreateOptionsMenu () واستخدام setVisible () بعد ذلك ، دون إبطال قائمة الخيارات.

1
Catalin Clabescu

بالنسبة لأولئك الذين يستخدمون مكتبة Appcompat: إذا كانت الفئات الفرعية للأنشطة الخاصة بك هي ActionBarActivity ، فيمكنك الاتصال بـ supportInvalidateOptionsMenu ()

ينظر هنا: https://stackoverflow.com/a/19649877/1562524

1
RuideraJ

أفضل طريقة لإخفاء كل العناصر في قائمة بأمر واحد فقط هي استخدام "مجموعة" في قائمة XML. فقط أضف كل عناصر القائمة التي ستكون في قائمة الفائض داخل نفس المجموعة.

في هذا المثال ، لدينا عنصران في القائمة سيتم عرضهما دائمًا (العنصر والبحث المعتاد) وثلاثة عناصر فيض:

<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) ، استخدم command setGroupVisible لتعيين رؤية كل عناصر القائمة إلى false أو true.

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

إذا كنت ترغب في استخدام هذا الأمر في أي مكان آخر في نشاطك ، فتأكد من حفظ فئة القائمة على المستوى المحلي ، وتحقق دائمًا مما إذا كانت القائمة خالية ، لأنه يمكنك التنفيذ قبل createOptionsMenu:

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
Adriano Moutinho

هذا النهج يعمل بالنسبة لي:

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
Forest baba

عملت هذا الرمز بالنسبة لي

@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
saigopi

أنت تحاول الوصول إلى عنصر قائمة من أحد الأنشطة ، والتي لا تملك حق الوصول إلى النطاق. ستعود المكالمة للعثور على عنصر القائمة خالية ، لأن العرض غير مرتبط لا النشاط ولا التخطيط الذي تتصل منه.

يتم ربط عناصر القائمة بعناصر مثل " شريط التنقل " والتي ترتبط بدورها بالنشاط المقابل.

لذلك قم بتهيئة طرق العرض هذه في النشاط () ، ثم قم بالوصول إلى عناصر القائمة التي تحتوي على طرق العرض هذه.

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

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