मेरे पास एक मेनू बार के साथ एक एक्शन बार है। मैं उस मेनू आइटम को कैसे छिपा / दिखा सकता हूं?
यही मैं करने की कोशिश कर रहा हूँ:
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 मेनू के हिसाब से निकाला जाता है।
अद्यतन: एक 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)
करने के लिए एक संदर्भ प्राप्त करना है। जवाब suhas_sm द्वारा और P1r4nh4 द्वारा सही दृष्टिकोण प्रस्तुत करते हैं। 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);
}
}
मेरे उदाहरण में मैंने सभी आइटम छिपाए हैं।
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>
तब आप मेनू आइटम की दृश्यता सेट कर सकते हैं अपने मेनू में झूठी करने के लिए मेनू को फुलाए जाने के बाद।
@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
"बूलियन ध्वज" नहीं है, यह छद्म बूलियन है। इसके अलावा, यहां एक वास्तविक बूलियन का उपयोग करने का कोई कारण नहीं है।
एंड्रॉइड डेवलपर आधिकारिक साइट के अनुसार, ऑनक्रीट ऑक्शनमेनू (मेनू मेनू) को मेनू आइटम या आइकन बदलने के लिए पुन: प्राप्त नहीं किया गया है, दृश्यता .. रनटाइम पर।
सिस्टम कॉल 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;
}
setVisible(false)
हमेशा दिखाई देने वाली वस्तु के लिए होता हूं , तब तक यह गायब नहीं होता है जब तक कि मैं तीन डॉट्स (मेनू ही) पर क्लिक नहीं करता। अगर मैं का उपयोग invalidateOptionsMenu()
में onPrepareOptionsMenu
आइटम तुरंत ही पुनर्निर्माण, लेकिन वे अपने कार्यों ढीला (अगर मैं किसी भी आइटम पर क्लिक करें, यह कुछ भी नहीं है)।
किसी वैरिएबल पर मान सेट करें और अमान्य कॉल करेंMenu ();
उदाहरण के लिए
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
आइटम तुरंत ही पुनर्निर्माण, लेकिन वे अपने कार्यों ढीला (अगर मैं किसी भी आइटम पर क्लिक करें, यह कुछ भी नहीं है)।
मेनू में सभी मदों की दृश्यता सेट करके, ऐपबार मेनू या ओवरफ्लो मेनू स्वचालित रूप से छिपाया जाएगा
उदाहरण
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);
}
अन्य टुकड़ा उपयोग करने के लिए bellow कोड जाने से पहले:
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
https://stackoverflow.com/a/21215280/466363 - लुक अल्टरनेओ और सूफियान द्वारा उत्तर दिया गया
।
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 पर बेहतर) पर, सभी मेनू आइटम दृश्यता को गलत या सत्य पर सेट करने के लिए कमांड सेटग्रुपविविज़ का उपयोग करें।
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
यदि आप अपनी गतिविधि पर कहीं और इस आदेश का उपयोग करना चाहते हैं, तो मेनू क्लास को स्थानीय रूप से सहेजना सुनिश्चित करें, और हमेशा जांचें कि क्या मेनू शून्य है, क्योंकि आप createOuesMenu से पहले निष्पादित कर सकते हैं:
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 को उपवर्गित करती है, तो आप supportInvalidateOptionsMenu () को कॉल कर सकते हैं।
यहाँ देखें: https://stackoverflow.com/a/19649877/1562524
मुझे लगता है कि मेनू के लिए एक सदस्य चर का उपयोग करने के लिए एक बेहतर तरीका होगा, इसे onCreateOptionsMenu () में प्रारंभ करें और बस विकल्प मेनू को अमान्य किए बिना सेटविज़ुअल () का उपयोग करें।
इस कोड ने मेरे लिए काम किया
@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 () का उपयोग करना चाहिए और गतिविधि के दौरान परिवर्तन नहीं करना चाहिए ...
जब कोई घटना होती है और आप एक मेनू अपडेट करना चाहते हैं, तो आपको अमान्य कॉल करना होगा Menu () अनुरोध करने के लिए कि सिस्टम कॉल onPrepareOptionsMenu ()।
एंड्रॉइड कोटलिन, प्रोग्राम बार में मेनू आइटम के छिपने या दृश्यता को निर्धारित करता है।
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)
}