ฉันจะซ่อนรายการเมนูในแถบการกระทำได้อย่างไร


346

ฉันมีแถบแอ็คชั่นพร้อมชุดสูท ฉันจะซ่อน / แสดงรายการเมนูได้อย่างไร

นี่คือสิ่งที่ฉันพยายามทำ:

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

คำตอบ:


484

รับการMenuItemชี้ไปที่รายการดังกล่าวเรียกsetVisibleใช้เพื่อปรับการมองเห็นแล้วเรียกinvalidateOptionsMenu()ใช้กิจกรรมของคุณเพื่อปรับเมนู ActionBar ให้สอดคล้องกัน

อัปเดต: A MenuItemไม่ใช่มุมมองปกติที่เป็นส่วนหนึ่งของเค้าโครงของคุณ มันเป็นอะไรที่พิเศษแตกต่างอย่างสิ้นเชิง ผลตอบแทนที่รหัสของคุณnullสำหรับitemและที่ก่อให้เกิดความผิดพลาด สิ่งที่คุณต้องการแทนคือการทำ:

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

นี่คือลำดับที่คุณควรจะโทร: โทรครั้งแรกinvalidateOptionsMenu()และจากนั้นภายในonCreateOptionsMenu(Menu)ได้รับการอ้างอิงถึง MenuItem (โดยการโทรmenu.findItem()) และโทรหาsetVisible()มัน


นี่คือสิ่งที่ฉันคิดในตอนแรก แต่สิ่งนี้ทำให้แอปพลิเคชันขัดข้อง
ผัด Zoltan

3
@ ผัดZoltán: นั่นเป็นวิธีที่คุณทำคุณอาจทำผิดถ้าแอปพลิเคชันขัดข้อง ตัวอย่างเช่นคุณMenuItemอาจจะเป็นnullเพราะคุณกำลังใช้แทนgetItem findItemเราไม่สามารถรู้ได้โดยไม่เห็นทั้งรหัสและบันทึกข้อผิดพลาดของคุณ
K-ballo

ตกลง แต่ฉันจะรับการอ้างอิงไปยังเมนูภายนอกเมธอด onCreateOptionsMenu ได้อย่างไร
ผัด Zoltan

7
@ คนZoltán: ฉันเชื่อว่าคุณไม่เข้าใจความคิดเห็นล่าสุด ... เพียงแค่อ้างอิงถึงรายการเมนูของคุณที่onCreateOptionsMenuและตั้งค่าการมองเห็นรายการ ณ จุดนั้น หรือเก็บข้อมูลอ้างอิงไว้รอบ ๆ จนกว่าคุณจะตัดสินใจว่าควรจะมองเห็นหรือไม่
K-ballo

33
ฉันคิดว่า (อย่างดีที่สุด) คำตอบนี้พูดไม่ดีเพราะลำดับขั้นตอนผิด ลำดับที่ถูกต้องคือการโทรครั้งแรกinvalidateOptionsMenu()และจากนั้นภายในonCreateOptionsMenu(Menu)ได้รับการอ้างอิงถึงMenuItem(โดยการโทรmenu.findItem()) และโทรหาsetVisible()มัน คำตอบโดย suhas_smและโดย P1r4nh4นำเสนอวิธีการที่ถูกต้อง
Ted Hopp

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
นี่คือสิ่งที่ฉันกำลังมองหา การถือ MenuItem และการเรียก setVisible () ดูเหมือนจะไม่ทำตามที่ฉันคาดไว้ (อาจเป็นเพราะฉันเรียกว่า
Matt

4
หากคุณจะซ่อนทุกรายการมีวิธีที่ง่ายกว่า แทนที่จะวนลูปผ่านแต่ละรายการที่นี่คุณทำได้: if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }รัฐเอกสาร: "คุณต้องกลับจริงสำหรับเมนูที่จะแสดงถ้าคุณกลับเท็จมันจะไม่ปรากฏ"
w3bshark

นอกจากนี้ฉันต้องการพูดถึงว่าวิธีนี้สะอาดกว่าคำตอบที่ยอมรับ ขอบคุณสำหรับการแบ่งปัน!
w3bshark

โดยการเรียก invalidateOptionMenu () onCreateOptionMenu () เรียกและฉันจัดการกับเงื่อนไขของฉันใน onCreateOptionMenu () ขอบคุณสำหรับคำตอบที่ดี
user1912026

onPrepareOptionsMenu()ควรใช้สำหรับการแสดง / ซ่อนตรรกะแทนที่จะ onCreateOptionsMenu()เรียกว่าครั้งเดียวเท่านั้นจึงไม่มีประโยชน์ถ้าคุณต้องการเปลี่ยนรายการเมนูหลังจากการเริ่มต้น ดังนั้นขยายใน onCreate แต่แสดง / ซ่อนใน onPrepare
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
หากคุณตั้งค่าสถานะเป็นบูลีนคุณสามารถตั้งค่าการมองเห็นรายการเป็นค่าสถานะ (หรือ! flag) หากจำเป็น ดังนั้น item.setVisbility (! flag); ทำให้สิ่งนี้เป็นหนึ่งซับโดยไม่มีเงื่อนไขหาก
jwehrle

ตัวแปร "menu" ถูกกำหนดไว้ที่ไหน
Jonathan

มันถูกส่งผ่านเป็นพารามิเตอร์ถึงonCreateOptionsMenu
suhas_sm

การใช้วิธีการนี้จะหมายถึงรายการยังคงใช้พื้นที่และคุณอาจท้ายด้วย "ช่องว่าง" ใน UI ของคุณที่ปุ่มควรจะเป็น ใช้ removeItem ใน onPrepareOptionsMenu () จะทำเคล็ดลับ
JCutting8

39

คุณสามารถเรียกสิ่งนี้:

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

ปรับปรุง:

ตรวจสอบให้แน่ใจรหัสของคุณไม่ได้ผลตอบแทนnullสำหรับitemหรืออาจเกิดความผิดพลาดของโปรแกรมประยุกต์


การใช้วิธีการนี้จะหมายถึงรายการยังคงใช้พื้นที่และคุณอาจท้ายด้วย "ช่องว่าง" ใน UI ของคุณที่ปุ่มควรจะเป็น ใช้ removeItem ใน onPrepareOptionsMenu () จะทำเคล็ดลับ
JCutting8

33

ฉันกำลังมองหาคำตอบที่มีบริบทมากกว่านี้ ตอนนี้ฉันรู้แล้วฉันจะเพิ่มคำตอบนั้น

ซ่อนปุ่มตามค่าเริ่มต้นในเมนู xml

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>

แสดงปุ่มในรหัส

แต่ปุ่มแชร์สามารถเลือกแสดงได้ตามเงื่อนไข

ป้อนคำอธิบายรูปภาพที่นี่

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 () เนื่องจากมันถูกเรียกเพียงครั้งเดียวดังนั้นจึงไม่มีประโยชน์ถ้าคุณต้องการเปลี่ยนรายการเมนูหลังจากการเริ่มต้น ดังนั้นขยายใน onCreate แต่แสดง / ซ่อนใน onPrepare จากนั้นใช้invalidateOptionsMenu()เพื่อรีเฟรชเมนู
JCutting8

24

ไม่ได้ผลสำหรับฉัน ฉันต้องใช้อย่างชัดเจนonPrepareOptionsMenuเพื่อตั้งรายการที่มองไม่เห็น

ใช้onCreateOptionsMenuเพื่อสร้างเมนูและonPrepareOptionsMenuเปลี่ยนการมองเห็นเป็นต้น


1
สำหรับฉันมันทำงานได้ทั้งสองวิธี แต่จากเอกสารของ Android onPrepareOptionsMenuดูเหมือนว่าเป็นสถานที่ที่เหมาะสมในการทำงานประเภทนี้: "เตรียมเมนูตัวเลือกมาตรฐานของหน้าจอที่จะแสดงซึ่งเรียกว่าถูกต้องก่อนแสดงเมนูทุกครั้งที่แสดง คุณสามารถใช้วิธีนี้เพื่อเปิด / ปิดการใช้งานรายการต่าง ๆ หรือแก้ไขเนื้อหาแบบไดนามิก "
yuval

ใช่มันเหมาะอย่างยิ่ง onPrepareOptionsMenu () ควรใช้สำหรับการแสดง / ซ่อนตรรกะแทน onCreateOptionsMenu () เนื่องจากมันถูกเรียกเพียงครั้งเดียวดังนั้นจึงไม่มีประโยชน์ถ้าคุณต้องการเปลี่ยนรายการเมนูหลังจากการเริ่มต้น ดังนั้นขยายใน onCreate แต่แสดง / ซ่อนใน onPrepare จากนั้นใช้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
ในกรณีของฉัน onPrepareOptionsMenu คืนค่าบูลีนไม่ใช่โมฆะ
CoolMind

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ไม่ใช่ "ธงบูลีน" มันเป็นแบบหลอกบูลีน นอกจากนี้ไม่มีเหตุผลที่จะใช้บูลีนจริงที่นี่
Ingo Bürk

2
นอกจากนี้คุณสามารถมีหลายรัฐไม่ใช่เพียงแค่หนึ่งที่จะซ่อนและหนึ่งที่จะแสดง ขึ้นอยู่กับความซับซ้อนของแอพของคุณและการที่คุณปฏิเสธที่จะเขียนกิจกรรมใหม่สำหรับแอพใหม่คุณอาจมีสถานะ SHOW_ALL, สถานะ HIDE_ALL แต่ยังเป็นสถานะ HIDE_EDIT หรือ HIDE_SHARE ในกรณีที่คุณต้องการซ่อนบางส่วนของเมนู
P1r4nh4

4

ตามเว็บไซต์อย่างเป็นทางการของนักพัฒนา Android, OnCreateOptionMenu (เมนูเมนู) ไม่ได้รับการแนะนำสำหรับการเปลี่ยนรายการเมนูหรือไอคอนการมองเห็น .. ฯลฯ ที่รันไทม์

หลังจากระบบเรียกใช้ onCreateOptionsMenu () ระบบจะเก็บอินสแตนซ์ของเมนูที่คุณป้อนและจะไม่เรียกใช้ onCreateOptionsMenu () อีกครั้งเว้นแต่ว่าเมนูจะไม่ถูกต้องด้วยเหตุผลบางประการ อย่างไรก็ตามคุณควรใช้ onCreateOptionsMenu () เท่านั้นเพื่อสร้างสถานะเมนูเริ่มต้นและไม่ทำการเปลี่ยนแปลงในช่วงระยะเวลากิจกรรม

หากคุณต้องการแก้ไขเมนูตัวเลือกตามกิจกรรมที่เกิดขึ้นในช่วงระยะเวลากิจกรรมคุณสามารถทำได้ในเมธอด onPrepareOptionsMenu () วิธีนี้ส่งผ่านคุณวัตถุเมนูตามที่มีอยู่ในปัจจุบันเพื่อให้คุณสามารถแก้ไขได้เช่นเพิ่มลบหรือปิดการใช้งานรายการ (แฟรกเมนต์ยังมีการโทรกลับ onPrepareOptionsMenu ()) --AndroidDeveloper เว็บไซต์อย่างเป็นทางการ -

ในฐานะที่เป็นแนะนำคุณสามารถใช้วิธีนี้onOptionsItemSelected (รายการเมนูรายการ)ติดตามการป้อนข้อมูลของผู้ใช้

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

บางรายการสามารถมองเห็นได้เสมอดังนั้นเมื่อฉันsetVisible(false)สำหรับรายการที่มองเห็นได้เสมอมันจะไม่หายไปจนกว่าฉันจะคลิกที่จุดทั้งสาม (เมนูเอง) หากฉันใช้invalidateOptionsMenu()ในonPrepareOptionsMenuรายการทันทีจัดระเบียบตัวเอง แต่พวกเขาหลวมกระทำของพวกเขา (ถ้าฉันคลิกที่รายการใด ๆ ก็ไม่ทำอะไรเลย)
Aliton Oliveira

3

ตั้งค่าเป็นตัวแปรและเรียกใช้ 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);
}

บางรายการสามารถมองเห็นได้เสมอดังนั้นเมื่อฉันsetVisible(false)สำหรับรายการที่มองเห็นได้เสมอมันจะไม่หายไปจนกว่าฉันจะคลิกที่จุดทั้งสาม (เมนูเอง) หากฉันใช้invalidateOptionsMenu()ในonPrepareOptionsMenuรายการทันทีจัดระเบียบตัวเอง แต่พวกเขาหลวมกระทำของพวกเขา (ถ้าฉันคลิกที่รายการใด ๆ ก็ไม่ทำอะไรเลย)
Aliton Oliveira

3

คุณสามารถใช้toolbar.getMenu().clear();เพื่อซ่อนรายการเมนูทั้งหมดในครั้งเดียว


@Ajeet_Yadav มีวิธีทำให้เมนูมองเห็นหลังจากที่คุณล้างมันหรือไม่?
Shawn

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 - ตอบโดย Look Alterno และ Sufian

  • ActivityCompat.invalidateOptionsMenu () ไม่ได้โทรกลับบนPrepareOptionsMenu (); เพียงอัปเดตเมนูโดยตรง
  • someMethod () ของฉันถูกเรียกจากหลาย ๆ ที่แม้กระทั่งก่อนหน้า onCreateOptionsMenu () ดังนั้นฉันต้องตรวจสอบ mMenu! = null
  • ควรทำงานโดยใช้ 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 () ไม่ได้โทรกลับบนPrepareOptionsMenu (); เพียงอัปเดตเมนูโดยตรง

  • someMethod () ของฉันถูกเรียกจากหลาย ๆ ที่แม้กระทั่งก่อนหน้า onCreateOptionsMenu () ดังนั้นฉันต้องตรวจสอบ mMenu! = null

  • ควรทำงานโดยใช้ 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 + คลิก R.id.menu_open และตรวจสอบว่ามีอยู่ในไฟล์เมนูเดียวเท่านั้น ในกรณีที่ทรัพยากรนี้ถูกใช้ไปแล้วทุกที่และโหลดในกิจกรรมก็จะพยายามซ่อนที่นั่น


2

วิธีที่ดีที่สุดในการซ่อนรายการทั้งหมดในเมนูที่มีเพียงคำสั่งเดียวคือใช้ "กลุ่ม" ในเมนู 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) ให้ใช้คำสั่ง setGroupVisible เพื่อตั้งค่าการมองเห็นรายการเมนูทั้งหมดเป็นเท็จหรือจริง

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

ฉันคิดว่าวิธีที่ดีกว่าคือการใช้ตัวแปรสมาชิกสำหรับเมนูเริ่มต้นใน onCreateOptionsMenu () และใช้ setVisible () หลังจากนั้นโดยไม่ทำให้เมนูตัวเลือกใช้ไม่ได้


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 () เท่านั้นเพื่อสร้างสถานะเมนูเริ่มต้นและไม่ทำการเปลี่ยนแปลงในช่วงวงจรกิจกรรม ...

เมื่อมีเหตุการณ์เกิดขึ้นและคุณต้องการทำการอัปเดตเมนูคุณต้องเรียกใช้ invalidateOptionsMenu () เพื่อขอให้ระบบทำการเรียกใช้งานบน

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


0

Android kotlin, ซ่อนหรือตั้งค่าการเปิดเผยของรายการเมนูในแถบการกระทำโดยทางโปรแกรม

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.