لدي شريط عمل مع menuitem. كيف يمكنني إخفاء/إظهار عنصر القائمة هذا؟
هذا ما أحاول القيام به:
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()
عليه
وجدت ملحق لهذا السؤال:
إذا كنت ترغب في تغيير مستوى رؤية عناصر القائمة الخاصة بك أثناء التنقل ، فأنت بحاجة فقط إلى تعيين متغير عضو في نشاطك لتتذكر أنك تريد إخفاء القائمة والاتصال بـ 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);
}
}
في مثالي ، قمت بإخفاء كل العناصر.
نعم فعلا.
invalidateOptionsMenu()
عندما تريد إخفاء الخيار. هذا سوف ندعو onCreateOptionsMenu()
.onCreateOptionsMenu()
، تحقق من العلم/الحالة وأظهرها أو أخفيها بالطريقة التالية:MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
يمكنك الاتصال بهذا:
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;
}
لم يعمل لي. اضطررت إلى استخدام onPrepareOptionsMenu
صراحة لتعيين عنصر غير مرئي.
لذا استخدم onCreateOptionsMenu
لإنشاء القائمة و onPrepareOptionsMenu
لتغيير الرؤية وما إلى ذلك.
هذا عملت لي من كل من النشاط وشظية
@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);
}
في البداية قم بتعيين رؤية عنصر القائمة على خطأ في ملف تخطيط القائمة على النحو التالي:
<?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);
}
}
إجابة 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);
}
}
يمكنك استخدام 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);
}
عيّن قيمة إلى متغير واتصل 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);
}
وفقًا لموقع 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;
}
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 () لا يقوم باستدعاء onPrepareOptionsMenu ()؛ انها مجرد تحديث القائمة مباشرة.
اتصل بي someMethod () من عدة أماكن ، حتى قبل onCreateOptionsMenu () ، لذلك يجب التحقق من mMenu! = خالية.
إذا كنت قد فعلت كل شيء كما هو مذكور في الإجابات أعلاه ، ولكن عنصر القائمة ما زال مرئيًا ، فتحقق من الرجوع إلى فريد المورد. على سبيل المثال ، في 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 وتحقق من وجوده في ملف قائمة واحد فقط. في حالة استخدام هذا المورد بالفعل في أي مكان وتحميله في أحد الأنشطة ، فسيحاول إخفاءه.
جرب هذا:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
أعتقد أن الطريقة الأفضل تتمثل في استخدام متغير عضو للقائمة ، وتهيئته في onCreateOptionsMenu () واستخدام setVisible () بعد ذلك ، دون إبطال قائمة الخيارات.
بالنسبة لأولئك الذين يستخدمون مكتبة Appcompat: إذا كانت الفئات الفرعية للأنشطة الخاصة بك هي ActionBarActivity ، فيمكنك الاتصال بـ supportInvalidateOptionsMenu ()
أفضل طريقة لإخفاء كل العناصر في قائمة بأمر واحد فقط هي استخدام "مجموعة" في قائمة 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
}
هذا النهج يعمل بالنسبة لي:
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;
}
عملت هذا الرمز بالنسبة لي
@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);
}
أنت تحاول الوصول إلى عنصر قائمة من أحد الأنشطة ، والتي لا تملك حق الوصول إلى النطاق. ستعود المكالمة للعثور على عنصر القائمة خالية ، لأن العرض غير مرتبط لا النشاط ولا التخطيط الذي تتصل منه.
يتم ربط عناصر القائمة بعناصر مثل " شريط التنقل " والتي ترتبط بدورها بالنشاط المقابل.
لذلك قم بتهيئة طرق العرض هذه في النشاط () ، ثم قم بالوصول إلى عناصر القائمة التي تحتوي على طرق العرض هذه.
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);