एंड्रॉइड एक्शन बार ओवरफ्लो नहीं दिखा रहा है


90

मेरे ऐप में 3 आइटम के साथ एक एक्शन बार है।

केवल 2 को अंतरिक्ष के मुद्दों के कारण प्रदर्शित किया जा सकता है, इसलिए मुझे उम्मीद है कि पहले प्रदर्शित किया जाएगा और बाकी को अतिप्रवाह में प्रदर्शित किया जाएगा। हालांकि व्यवहार में केवल पहले 2 आइटम दिखाए गए हैं और कोई अतिप्रवाह योग्य नहीं है।

यहाँ प्रासंगिक कोड है: list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

Activity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}

120
यदि आपके डिवाइस में एक मेनू-बटन है, तो अतिप्रवाह-आइकन दिखाई नहीं देगा। आप किस डिवाइस पर हैं?
रीनियर

1
वर्चुअल डिवाइस पर मैं परीक्षण कर रहा हूँ वास्तव में एक मेनू बटन है, इसे क्लिक किया और लापता आइटम दिखाया, धन्यवाद!
मैट रेमन

2
@ राइनियर मैं ActionBarSherlock का उपयोग कर रहा हूं। गैलेक्सी ऐस 2.3 रनिंग पर दिखाया गया है, गैलेक्सी एसआईआई 4.0 पर चलने पर यह नहीं दिखाया गया है। दोनों में HW मेन्यू बटन है।
मिस्टर स्मिथ

2
मैं इस बात की पुष्टि करना चाहता था कि इसने मुझे चकरा दिया था कि मेरे पास गैलेक्सी नोट II पर नहीं, एक नेक्सस not पर ओवरफ्लो आइकन था। नोट में एक मेनू बटन था। धन्यवाद!
बाउसटनर

@ राइनियर कृपया मुझे उसी मुद्दे का सामना करने में मदद करें जो मुझे करना चाहिए?
रुपए

जवाबों:


125

यदि आप डिवाइस मेनू बटन की परवाह किए बिना तीन डॉट्स दिखाना चाहते हैं! तब आप इस विधि को अपने एप्लिकेशन वर्ग 'ऑनक्रेट विधि' में कह सकते हैं-

private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

32
यह एक भयानक हैक है जो प्लेटफ़ॉर्म पर बाकी ऐप्स के साथ निरंतरता को तोड़ता है। यह मत करो।
प्रात:

19
यह दो बुराइयों के कम होने जैसा लगता है। वर्तमान व्यवहार अस्वीकार्य है।
biorbnA

6
यह अतिप्रवाह करने की अनुमति देने का एक शानदार तरीका है, मेनू हार्ड कुंजी को अब सहन नहीं किया जाना चाहिए।
नेक्रोनट

5
यह बहुत अच्छा काम करता है! भले ही उपयोगकर्ता हार्डवेयर मेनू बटन दबाए (जो शानदार है) काम करता है, हालांकि आप मेनू ध्वनि प्रभाव दो बार सुनेंगे .. क्या कोई जानता है कि यह केवल एक बार ध्वनि कैसे करें?
ब्रूस

5
यह एक छिपा नहीं है। देवताओं को यह जानने की जरूरत है कि हैकिंग क्या है क्योंकि यह एंड्रॉइड में सिर्फ 2 + 2 नहीं है। प्रतिबिंब जावा तंत्र का उपयोग करके समय की बचत कर रहा है, या फिर आप अपने आंतरिक कक्षाओं में 24/7, या एओएसपी को अनंत तक अनुकूलित करने के संदर्भों को पारित करेंगे। मेरे लिए यह समाधान ओवरराइड होने की समस्या को हल करता है और इसमें AOSP कस्टम कंटेंट और जुड़े हुए, निजी संघों को शामिल किया जाता है, जो शुद्धियों को स्वच्छ मानते हैं। क्या आप जानते हैं कि आप FASTSCROLL को छोटी सूचियों के लिए लगातार सक्षम नहीं बना सकते इससे पहले कि मैं प्रतिबिंब का उपयोग करता, मुझे 10+ एओएसपी संसाधनों की प्रतिलिपि बनाने की आवश्यकता थी, एक चार एड के लिए।
leRobot

54

कार्रवाई बार

रेस / मेनू / menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

}

एक्शन बार आइकन सेट डाउनलोड करें


2
@ रेइनियर टिप्पणी पर एक नज़र डालें, यह सच है "यदि आपके डिवाइस में एक मेनू बटन है, तो अतिप्रवाह-आइकन दिखाई नहीं देगा"।
अहमद द्विक 'वारलॉक'

मैं डिवाइस में परीक्षण करता हूं जिसमें मेनू बटन है और मेरे मामले में अतिप्रवाह दिखाई दे रहा है। मैं android:showAsAction="always"और अधिक आइटम के लिए उपयोग करता हूं
किरीट वाघेला

आपने किस डिवाइस पर इसका परीक्षण किया है? मैंने एक नव v xperia और s # का उपयोग किया है
अहमद द्विक 'Warlock'

1
नोट: आपका आइटम जो आपके अतिप्रवाह मेनू को फुलाता है MUST showAsAction = "हमेशा"
किरीट वाघेला

1
showAsAction पुराने एसडीके में एंड्रॉइड नेमस्पेस में उपलब्ध नहीं है। इसे दूर करने के लिए इस लिंक developer.android.com/training/basics/actionbar/… का अनुसरण करें । इस NS स्कीमा को जोड़ने के बाद .android.com / apk / res-auto , उपरोक्त ट्रिक ने मेरे लिए पूरी तरह से ठीक काम किया
chedine

42

मुझे लगता है कि यह एक अतिप्रवाह मेनू नहीं है, लेकिन यह समान है। ठीक है, यह सरल है लेकिन यह पता लगाना कठिन था।

आपको पहले एक मेनू आइटम की आवश्यकता है जिसे आप ओवरफ्लो इन्फ्लोटर के रूप में उपयोग करना चाहते हैं। उदाहरण

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

एक बार जब आप अपने आइटम, एक उप-मेनू जोड़ने के अपने आइटम आप अतिप्रवाह मेनू में चाहते हैं। उदाहरण:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

क्लिक करने पर यह अन्य मदों को बढ़ा देगा। मेरा एप्लिकेशन ActionBarSherlock 4.0 का उपयोग कर रहा है, इसलिए इससे पहले कि यह आपके लिए काम करेगा, आपको "स्प्लिटएशनबार" तक पहुंचने की आवश्यकता होगी। (अभी भी डिफ़ॉल्ट Android Actionbar पर काम करेंगे)

यहां बताया गया है: आपकी AndroidManifest.xml फ़ाइल में, आपको इस कोड को उस गतिविधि के तहत जोड़ना होगा, जिसमें आपको अतिप्रवाह मेनू की आवश्यकता है।

android:uiOptions="splitActionBarWhenNarrow"

नोट: आपका आइटम जो आपके अतिप्रवाह मेनू को फुलाता हैshowAsAction="always"

Vwola! आपके पास एक अतिप्रवाह मेनू है! आशा है कि मैंने आपकी मदद की। :)


3
अच्छा समाधान, मेनू बटन हैक की तुलना में बेहतर है।
ol0

26

हार्डवेयर मेनू बटन वाले उपकरणों पर (गैलेक्सी S3, सैमसंग के रूप में जिद्दी ...) अतिप्रवाह मेनू हार्डवेयर मेनू बटन का उपयोग करके 'पारंपरिक' मेनू के रूप में व्यवहार करता है।


2
पुराने उत्तर, हालांकि संगतता पुस्तकालय में बहुत ही विषम परिणामों के साथ ठोकर खाई जाती है: हार्डवेयर बटन के साथ 3 डिवाइस, नोट 3 नियो = अतिप्रवाह मेनू दिखाया गया है, मेनू बटन काम नहीं करता है, नोट 1 = कोई अतिप्रवाह, मेनू बटन काम नहीं करता है, गैलेक्सी एस 3, नहीं अतिप्रवाह, मेनू बटन काम नहीं करता है! यह पागलपन है।
3c71

5

जब आप "अतिप्रवाह" मेनू कहते हैं, तो क्या आपका मतलब तीन बिंदुओं से है जो अंत में दिखाते हैं कि यह इंगित करता है कि अधिक आइटम हैं .... या क्या आपका मतलब है कि विभाजित एक्शनबार ओवरफ्लो आइटम के लिए नीचे दिखाई देता है?

यदि आपको विभाजित एक्शन बार से मतलब है, तो आपको इसे अपनी गतिविधि की मैनिफ़ेस्ट फ़ाइल में जोड़ना चाहिए

android:uiOptions="splitActionBarWhenNarrow"

डिफ़ॉल्ट रूप से, तीन डॉट्स अतिप्रवाह मेनू स्वचालित रूप से होना चाहिए, इसलिए यह बताना मुश्किल है कि आपके द्वारा दी गई जानकारी से समस्या क्या है।


मेरा मतलब तीन बिंदुओं से है। यह आइटमों के कारण ऐसा नहीं है, क्योंकि जब भी ऑर्डर के आइटम बदलते हैं, तो यह पहले 2 आइकन हैं जो दिखाए गए हैं
मैट रेमेन

क्या मुझे वास्तविक समस्या का निर्धारण करने में सक्षम होने के लिए अतिरिक्त जानकारी प्रदान करनी चाहिए?
मैट रेमेन

आपके minSdkVersion, targetSdkVersion और आपके द्वारा परीक्षण किए जा रहे संस्करण क्या हैं?
स्पार्कली

5
क्या आपके डिवाइस में मेनू के लिए भौतिक बटन हैं या वे गैलेक्सी नेक्सस फोन की तरह आभासी बटन हैं? मुझे लगता है कि तीन डॉट्स तभी दिखेंगे जब आपके फोन में फिजिकल बटन नहीं होंगे।
wnafee

5

एक्शनबारकॉम पर एक्शन ओवरफ़्लो (तीन डॉट) दिखाने के
लिए: मेनू फ़ाइल में, उदाहरण:
main.xml

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

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

और गतिविधि फ़ाइल में:

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

यह मेरे लिए ठीक काम है।
Google Nexus S, Samsung S3 पर परीक्षण किया गया।


3

ऐसा प्रतीत होता है कि मेनू बटन वाले उपकरणों में एक्शनबॉलर में ओवरफ्लो मेनू नहीं दिखता है। इसके अलावा हमारे पास यह जानने का कोई तरीका नहीं है कि एपीआई स्तर 14 से पहले किसी डिवाइस में हार्डवेयर मेनू बटन है या नहीं (4.0+) ।

यह समाधान एक अतिप्रवाह बटन जोड़ता है जो android.support.v7.app.ActionBarकेवल पूर्व-हनीकॉम्ब (<3.0) पर मानक विकल्प मेनू खोलता है, अन्यथा इसे सिस्टम पर छोड़ देता है। किसी भी मामले में आप सभी कार्यों के बीच alwaysया इसके ifRoomलिए चयन कर सकते हैं ।

एक्शन बार आइकन पैक से ओवरफ्लो आइकन प्राप्त करें ।

एक मेनू जोड़ें (शीर्षक, आदेश आदि के रूप में कुछ गैर-प्रासंगिक भागों को जोड़ते हुए)

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

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

3.0 पर हमारी अतिप्रवाह कार्रवाई निकालें

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

अंत Activity.openOptionsMenu()में अतिप्रवाह कार्रवाई से कॉल करें ।

एर कोई। आप openOptionsMenu()मेनू बटन से कॉल नहीं कर सकते ... लेकिन यदि आप AndroidAnnotations का उपयोग कर रहे हैं तो आप आसानी से कर सकते हैं:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

अगर आपको ऐसा कुछ नहीं करना चाहिए, मुझे लगता है

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}


2

xmlns:your_app_name="http://schemas.android.com/apk/res-auto"मेनू टैग के अंदर रखें और इसके बजाय android:showAsAction="always"उपयोग करेंyour_app_name:showAsAction="always"

उदाहरण के लिए

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.