Android 4.3 मेनू आइटम showAsAction = "हमेशा" नजरअंदाज कर दिया


116

मैं एंड्रॉइड 4.3 (एपीआई स्तर 18) से शुरू होने वाले नए वी 7 एपकॉम्प लाइब्रेरी का उपयोग कर रहा हूं।

किसी मेनू आइटम के लिए showAsAction में निर्दिष्ट होने के बावजूद, यह नहीं दिखाया गया है - यह हमेशा अतिप्रवाह मेनू आइकन बनाता है, और मेनू के तहत एक भी मेनू आइटम डालता है।

इस तरह की गतिविधि में मेनू जोड़ने की कोशिश कर रहा है:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_sizes, menu);
    return true;
}

और यहाँ मेरा मेनू xml है:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

क्या यह नए समर्थन पुस्तकालय v7 का एक बग है, या कोड के साथ कुछ गलत है? मैं पहले भी कई बार ActionBarSherlock के साथ समान कोड का उपयोग कर चुका हूं।


2
सूचना के प्रयोजनों के लिए - "... "always"अनुशंसित नहीं है; "ifRoom"ओएस का उपयोग करना और निर्णय लेना बेहतर है ।"
चीफट्वोन्फिल्स

जवाबों:


313

संभवतः आपको आवश्यक नाम स्थान याद आ रहे हैं:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

[yourapp]अपने एप्लिकेशन नाम या किसी भी नाम स्थान के साथ अपने दिल की इच्छाओं को हर जगह बदलें ।

जाँच के लायक अन्य चीजें:

  • देखें कि क्या आपकी गतिविधि कक्षा फैली हुई है ActionBarActivity

जाँचें कि क्या समस्या बनी रहती है।


Android संदर्भ प्रलेखन: एक्शन बटन जोड़ना । यहाँ प्रासंगिक पाठ है:

यदि आपका ऐप Android 2.1 जैसे संस्करणों पर संगतता के लिए समर्थन लाइब्रेरी का उपयोग कर रहा है, तो showAsAction विशेषता Android से उपलब्ध नहीं है: नाम स्थान। इसके बजाय यह विशेषता समर्थन लाइब्रेरी द्वारा प्रदान की गई है और आपको अपने स्वयं के XML नामस्थान को परिभाषित करना होगा और उस नामस्थान को विशेषता उपसर्ग के रूप में उपयोग करना होगा। (एक कस्टम XML नेमस्पेस आपके ऐप के नाम पर आधारित होना चाहिए, लेकिन यह आपके द्वारा वांछित कोई भी नाम हो सकता है और केवल उस फ़ाइल के दायरे में पहुंच योग्य है जिसमें आप इसे घोषित करते हैं।)


2
यही मुझे पता चला है। साभार - निश्चित रूप से स्वीकार लेकिन showAsAction को उस कस्टम नेमस्पेस का उपयोग करना चाहिए।
मैकिंगवे

5
'yourapp' का अर्थ है String.xml <string name = "app_name"> yourapp </ string> सही?
LOG_TAG

4
क्या कोई समझा सकता है कि यह क्यों काम करता है? कस्टम नाम स्थान का विस्तार करने की आवश्यकता क्यों है? थोड़ा उलझन में।
रात्रि

8
@dineth appcompat को एक लाइब्रेरी प्रोजेक्ट के रूप में उपयोग किया जाता है। इसका अर्थ है कि आपके सभी संसाधन (स्ट्रिंग्स, ड्रॉबल, एट्रिब्यूट्स ...) एंड्रॉइड नेमस्पेस के बजाय आपके एप्लिकेशन नेमस्पेस में घोषित किए गए हैं। जैसा कि showAsActionएंड्रॉइड -7 में विशेषता मौजूद नहीं थी, आपको अपने ऐप नामस्थान का उपयोग करना होगा
निकोपिको

22
हर कोई "कस्टम नामस्थान" या "एक नाम स्थान जो आपके ऐप से मेल खाता है" कहता है। लेकिन नामस्थान हमेशा http://schemas.android.com/apk/res-autoहर उदाहरण में है। यह एक कस्टम एक नहीं है, या एक है जो आपके ऐप से मेल खाता है। यह प्रलेखन से वास्तविक नाम स्थान है। मुझे लगता है कि हर कोई एक कस्टम उपसर्ग का मतलब है , और यह वास्तव में आप जो चाहें कर सकते हैं। क्या ये सच है?
एंड्रयू अरनोट

52

खुद का पता लगाया। समर्थन पुस्तकालय v7 के साथ showAsAction इस तरह एक कस्टम नामस्थान के तहत जाना चाहिए:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

1
String.xml में 'गुब्बारा' का अर्थ है <string name = "app_name"> गुब्बारा </ string> "सही?
LOG_TAG

5
@LOG_TAG - नहीं, यह सिर्फ ऊपर दर्ज किया जाना चाहिए। यह एक स्ट्रिंग नहीं है, लेकिन एक नाम स्थान है।
बेक्का

ओह्ह सपोर्ट v7 इर्र ... इसके ओके सपोर्ट v4
यासिथा वड्यूज

स्पष्टीकरण के लिए धन्यवाद मैकिंगवे
नाइक

32

यह भी सुनिश्चित करें कि आप ActionBarActivity.onCreateOptionsMenu () विधि में सही फ्लोटर का उपयोग करते हैं।

सही समाधान:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

गलत समाधान:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);

1
मैंने उपरोक्त सभी उत्तर और स्टैकओवरफ्लो पर एक और उत्तर दिया है, लेकिन केवल एक चीज जो मुझे याद आ रही थी, वह है आप उत्तर - getMenuInflater ()। इसे साझा करने के लिए धन्यवाद।
Amt87

इसके लिए SO SOU को धन्यवाद। मैंने अपने सभी 100+ मेन्यू को कस्टम नेमस्पेस और 1 स्टिंकिन स्क्रीन का उपयोग करने के लिए कनवर्ट किया था। स्क्रीन अभी भी काम नहीं कर रही थी ... यह पता चलता है कि getMenuInflater () के बजाय 1 गतिविधि "नए MenuInflater" का उपयोग कर रही थी। अनेक अनेक धन्यवाद!
19

यह बहुत महत्वपूर्ण है। मैं menuInflater निर्माण (2 तरीका) का उपयोग कर रहा था। धन्यवाद
WTK

24

के लिए टुकड़े

कस्टम नाम स्थान के साथ मेनू जाएगा रोकने के प्रदर्शित होने से showAsAction।

ShowAsAction के लिए "एंड्रॉइड:" उपसर्ग का उपयोग करना काम करेगा, भले ही एंड्रॉइड स्टूडियो टिप्पणी करेगा कि आपको एक कस्टम नाम स्थान का उपयोग करना चाहिए

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>

यह एंड्रॉइड एसडीके 22 और समर्थन वी 4 टुकड़े का उपयोग कर रहा है, मामले में जो कोई फर्क नहीं पड़ता है।


केवल यही एक चीज है जिसने मेरी समस्या को हल किया (हालांकि यह त्रुटि दिखा रहा है)। धन्यवाद !
user2630165

3
आप उपकरण के साथ XML लेआउट में त्रुटि / चेतावनी को दबा सकते हैं: <आइटम> के भीतर = "AppCompatResource" पर ध्यान न दें। डॉक्स यहां: tools.android.com/tips/lint/suppressing-lint-warnings
बेकर

आपका जवाब और एंटोन किज़ेमा मेरे लिए सही समाधान हैं। और टिप के लिए भी धन्यवाद tools:ignore
हठ

16

एक ही समस्या है, लेकिन एंड्रॉइड 5. पर मेरे पास 3 आइटम हैं लेकिन ओएस ने मेरी विशेषता "हमेशा" को अनदेखा किया और केवल 2 आइटम दिखाए। यहाँ मेरा समाधान है:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}

1
setShowAsActionFlags()एपीआई 14 की आवश्यकता है, लेकिन यह अभी भी मेरे लिए सबसे अच्छा समाधान था।
मिस्टर जंगल

6

यह भी सुनिश्चित करें कि आपके पास नेमस्पेस के लिए सही रास्ता है। यह गलत होने पर आपको त्रुटि संदेश नहीं देगा।

मैं था

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/res-auto">

के बजाय

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/apk/res-auto">

मुझे पता था कि यह काम नहीं कर रहा था। निश्चित नहीं है कि मैं रास्ते का / apk भाग कैसे भूल गया, लेकिन ऐसा हुआ। कोई त्रुटि संदेश, नीचे ट्रैक करने के लिए बस एक मायावी बग।


6

मेरे मामले में, मुझे अपने ऐप के build.gradle संकलन 'com.android.support:appcompat-v7:21.0.3' से निकालना था।

सूचना : मेरा मिनट sdk = 14, और एंड्रॉइड स्टूडियो द्वारा बनाई गई परियोजना ने मेरी अप्रचलित निर्भरता को सम्मिलित किया।

इसके बाद आप android लिख सकते हैं: showAsAction = "हमेशा"


धन्यवाद यह मुझे बाहर हल! इस दिन शायद ज्यादातर मामलों में सबसे अच्छा समाधान, क्योंकि 4.0 से पहले एंड्रॉइड संस्करणों का समर्थन करना अनावश्यक है।
pinyin_samu

आपका जवाब और बेकर मेरे लिए सही समाधान हैं।
हठ

4

यह आपका मामला नहीं हो सकता है लेकिन मैं उपयोग कर रहा था

new MenuInflater(this).inflate(R.menu.my_menu, menu);

इसे बदल रहा है

getMenuInflater().inflate(R.menu.my_menu, menu);

समस्या तय!


0
<?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:id="@id/back"
        android:icon="@drawable/back"
        app:showAsAction="always"
        android:title="@string/back"/>
    <item
        android:id="@id/save"
        android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        android:title="@string/save"/>
</menu>

supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25 के साथ काम न करें

"चेतावनी" देखें

एप्लिकेशन का उपयोग करना चाहिए: xmlns के साथ appcompat लाइब्रेरी के साथ showAsAction: ऐप = "http://schemas.android.com/apk/res-auto" कम ... (Ctrl + F1)

Appcompat पुस्तकालय का उपयोग करते समय, मेनू संसाधनों को ऐप में showAsAction का उल्लेख करना चाहिए: नेमस्पेस, एंड्रॉइड नहीं: नेमस्पेस।

इसी तरह, जब ऐप्पकॉम लाइब्रेरी का उपयोग नहीं कर रहे हैं, तो आपको एंड्रॉइड का उपयोग करना चाहिए: showAsAction विशेषता।

मुझे लगता है कि चेतावनी को अनदेखा किया जा सकता है।


0

showAsAction और actionViewClass के लिए इस तरह कस्टम नामस्थान जोड़ें:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.widget.SearchView" />


0

मैंने इसे प्रतिस्थापित करके हल किया है

android:showAsAction="ifRoom"

साथ में

app:showAsAction="ifRoom"

यह मीनिटमे xml जैसा दिखता है,

<item android:id="@+id/action_refresh"
      android:title="Refresh"
      android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />

0

सबसे आसान तरीका है अपने कोड को जोड़कर संशोधित करें

xmlns:app="http://schemas.android.com/apk/res-auto"

और इस कोड को बदलें

android:showAsAction="always"

सेवा

app:showAsAction="always"

और अंत में

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        app:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.