ฉันมีแถบแอ็คชั่นพร้อมชุดสูท ฉันจะซ่อน / แสดงรายการเมนูได้อย่างไร
นี่คือสิ่งที่ฉันพยายามทำ:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
ฉันมีแถบแอ็คชั่นพร้อมชุดสูท ฉันจะซ่อน / แสดงรายการเมนูได้อย่างไร
นี่คือสิ่งที่ฉันพยายามทำ:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
คำตอบ:
รับการMenuItem
ชี้ไปที่รายการดังกล่าวเรียกsetVisible
ใช้เพื่อปรับการมองเห็นแล้วเรียกinvalidateOptionsMenu()
ใช้กิจกรรมของคุณเพื่อปรับเมนู ActionBar ให้สอดคล้องกัน
อัปเดต: A MenuItem
ไม่ใช่มุมมองปกติที่เป็นส่วนหนึ่งของเค้าโครงของคุณ มันเป็นอะไรที่พิเศษแตกต่างอย่างสิ้นเชิง ผลตอบแทนที่รหัสของคุณnull
สำหรับitem
และที่ก่อให้เกิดความผิดพลาด สิ่งที่คุณต้องการแทนคือการทำ:
MenuItem item = menu.findItem(R.id.addAction);
นี่คือลำดับที่คุณควรจะโทร: โทรครั้งแรกinvalidateOptionsMenu()
และจากนั้นภายในonCreateOptionsMenu(Menu)
ได้รับการอ้างอิงถึง MenuItem (โดยการโทรmenu.findItem()
) และโทรหาsetVisible()
มัน
MenuItem
อาจจะเป็นnull
เพราะคุณกำลังใช้แทนgetItem
findItem
เราไม่สามารถรู้ได้โดยไม่เห็นทั้งรหัสและบันทึกข้อผิดพลาดของคุณ
onCreateOptionsMenu
และตั้งค่าการมองเห็นรายการ ณ จุดนั้น หรือเก็บข้อมูลอ้างอิงไว้รอบ ๆ จนกว่าคุณจะตัดสินใจว่าควรจะมองเห็นหรือไม่
invalidateOptionsMenu()
และจากนั้นภายในonCreateOptionsMenu(Menu)
ได้รับการอ้างอิงถึงMenuItem
(โดยการโทรmenu.findItem()
) และโทรหาsetVisible()
มัน คำตอบโดย suhas_smและโดย P1r4nh4นำเสนอวิธีการที่ถูกต้อง
พบภาคผนวกของคำถามนี้:
หากคุณต้องการเปลี่ยนการเปิดเผยรายการเมนูของคุณในระหว่างการเดินทางคุณเพียงแค่ตั้งค่าตัวแปรสมาชิกในกิจกรรมของคุณให้จำไว้ว่าคุณต้องการซ่อนเมนูและเรียก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);
}
}
ในตัวอย่างของฉันฉันได้ซ่อนรายการทั้งหมด
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
รัฐเอกสาร: "คุณต้องกลับจริงสำหรับเมนูที่จะแสดงถ้าคุณกลับเท็จมันจะไม่ปรากฏ"
onPrepareOptionsMenu()
ควรใช้สำหรับการแสดง / ซ่อนตรรกะแทนที่จะ onCreateOptionsMenu()
เรียกว่าครั้งเดียวเท่านั้นจึงไม่มีประโยชน์ถ้าคุณต้องการเปลี่ยนรายการเมนูหลังจากการเริ่มต้น ดังนั้นขยายใน onCreate แต่แสดง / ซ่อนใน onPrepare
ใช่.
invalidateOptionsMenu()
เมื่อคุณต้องการซ่อนตัวเลือก สิ่งนี้จะเรียกonCreateOptionsMenu()
ว่าonCreateOptionsMenu()
ตรวจสอบการตั้งค่าสถานะ / และแสดงหรือซ่อนด้วยวิธีต่อไปนี้:MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
invalidateOptionsMenu
แทนinvalidateOptions
หรือไม่?
onCreateOptionsMenu
คุณสามารถเรียกสิ่งนี้:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
ปรับปรุง:
ตรวจสอบให้แน่ใจรหัสของคุณไม่ได้ผลตอบแทนnull
สำหรับitem
หรืออาจเกิดความผิดพลาดของโปรแกรมประยุกต์
ฉันกำลังมองหาคำตอบที่มีบริบทมากกว่านี้ ตอนนี้ฉันรู้แล้วฉันจะเพิ่มคำตอบนั้น
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;
}
invalidateOptionsMenu()
เพื่อรีเฟรชเมนู
ไม่ได้ผลสำหรับฉัน ฉันต้องใช้อย่างชัดเจนonPrepareOptionsMenu
เพื่อตั้งรายการที่มองไม่เห็น
ใช้onCreateOptionsMenu
เพื่อสร้างเมนูและonPrepareOptionsMenu
เปลี่ยนการมองเห็นเป็นต้น
onPrepareOptionsMenu
ดูเหมือนว่าเป็นสถานที่ที่เหมาะสมในการทำงานประเภทนี้: "เตรียมเมนูตัวเลือกมาตรฐานของหน้าจอที่จะแสดงซึ่งเรียกว่าถูกต้องก่อนแสดงเมนูทุกครั้งที่แสดง คุณสามารถใช้วิธีนี้เพื่อเปิด / ปิดการใช้งานรายการต่าง ๆ หรือแก้ไขเนื้อหาแบบไดนามิก "
invalidateOptionsMenu()
เพื่อรีเฟรชเมนู
เริ่มตั้งค่าการเปิดเผยรายการเมนูเป็นเท็จในไฟล์เลย์เอาต์เมนูดังนี้:
<?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);
}
}
ลองสิ่งนี้:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
สิ่งนี้ใช้ได้สำหรับฉันจากทั้งกิจกรรมและชิ้นส่วน
@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);
}
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);
}
}
0
และ1
ไม่ใช่ "ธงบูลีน" มันเป็นแบบหลอกบูลีน นอกจากนี้ไม่มีเหตุผลที่จะใช้บูลีนจริงที่นี่
ตามเว็บไซต์อย่างเป็นทางการของนักพัฒนา 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
รายการทันทีจัดระเบียบตัวเอง แต่พวกเขาหลวมกระทำของพวกเขา (ถ้าฉันคลิกที่รายการใด ๆ ก็ไม่ทำอะไรเลย)
ตั้งค่าเป็นตัวแปรและเรียกใช้ 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
รายการทันทีจัดระเบียบตัวเอง แต่พวกเขาหลวมกระทำของพวกเขา (ถ้าฉันคลิกที่รายการใด ๆ ก็ไม่ทำอะไรเลย)
คุณสามารถใช้toolbar.getMenu().clear();
เพื่อซ่อนรายการเมนูทั้งหมดในครั้งเดียว
โดยการตั้งค่าการมองเห็นของรายการทั้งหมดในเมนูเมนูแอปหรือเมนูล้นจะถูกซ่อนโดยอัตโนมัติ
ตัวอย่าง
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);
}
https://stackoverflow.com/a/21215280/466363 - ตอบโดย Look Alterno และ Sufian
.
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
หากคุณทำทุกอย่างตามคำตอบข้างต้น แต่รายการเมนูยังคงปรากฏให้ตรวจสอบว่าคุณอ้างอิงทรัพยากรที่ไม่ซ้ำ ตัวอย่างเช่นใน 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 และตรวจสอบว่ามีอยู่ในไฟล์เมนูเดียวเท่านั้น ในกรณีที่ทรัพยากรนี้ถูกใช้ไปแล้วทุกที่และโหลดในกิจกรรมก็จะพยายามซ่อนที่นั่น
วิธีที่ดีที่สุดในการซ่อนรายการทั้งหมดในเมนูที่มีเพียงคำสั่งเดียวคือใช้ "กลุ่ม" ในเมนู 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
}
สำหรับผู้ที่ใช้ไลบรารี Appcompat: หากกิจกรรมย่อยของคุณ ActionBarActivity subclasses คุณสามารถโทร supportInvalidateOptionsMenu ()
ฉันคิดว่าวิธีที่ดีกว่าคือการใช้ตัวแปรสมาชิกสำหรับเมนูเริ่มต้นใน onCreateOptionsMenu () และใช้ setVisible () หลังจากนั้นโดยไม่ทำให้เมนูตัวเลือกใช้ไม่ได้
รหัสนี้ใช้ได้สำหรับฉัน
@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);
}
วิธีการนี้ใช้ได้ผลสำหรับฉัน:
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;
}
คุณกำลังพยายามเข้าถึงรายการเมนูจากกิจกรรมซึ่งไม่มีสิทธิ์เข้าถึงขอบเขต การเรียกเพื่อค้นหารายการเมนูจะส่งคืนค่าว่างเนื่องจากมุมมองไม่ถูกผูกไว้กับกิจกรรมหรือโครงร่างที่คุณกำลังเรียก
รายการเมนูจะถูกผูกกับรายการต่าง ๆ เช่น " แถบนำทาง " ซึ่งจะถูกผูกกับกิจกรรมที่เกี่ยวข้อง
ดังนั้นเริ่มต้นมุมมองเหล่านั้นในกิจกรรม () จากนั้นเข้าถึงรายการเมนูภายในมุมมองนั้น
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
ใช้ invalidateOptionsMenu()
เพื่อที่จะโทร onPrepareOptionsMenu(menu: Menu?)
คุณควรใช้ onCreateOptionsMenu () เท่านั้นเพื่อสร้างสถานะเมนูเริ่มต้นและไม่ทำการเปลี่ยนแปลงในช่วงวงจรกิจกรรม ...
เมื่อมีเหตุการณ์เกิดขึ้นและคุณต้องการทำการอัปเดตเมนูคุณต้องเรียกใช้ invalidateOptionsMenu () เพื่อขอให้ระบบทำการเรียกใช้งานบน
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)
}