2012-01-28 12 views
42

है, मैं वर्तमान में इस समस्या से जूझ रहा हूं। मुझे यह जांचने की ज़रूरत है कि डिवाइस, जहां ऐप इंस्टॉल है, में हार्डवेयर मेनू कुंजी है या नहीं। चूंकि यह गैलेक्सी नेक्सस जैसे कुछ उपकरणों पर मौजूद नहीं है, इसलिए मैं इसे सीधे इस मामले में यूआई में दिखा रहा हूं।एंड्रॉइड: प्रोग्रामेटिक रूप से पता लगाएं कि डिवाइस में हार्डवेयर मेनू बटन

मैं पहले से ही PackageManager.hasSystemFeature() पर ध्यान दिया है, लेकिन वहाँ कुछ भी उपयोगी नहीं मिला।

क्या कोई इसे पहले से ही कर चुका है?

+0

हाय। आपके उत्तर के लिए धन्यवाद। मैं एक्शन बार का उपयोग करके चारों ओर घूमना चाहता हूं क्योंकि यह मेरी राय में ज्यादा जगह लेता है। गैलेक्सी नेक्सस पर मैं यूआई में एक मेनू बटन प्रदर्शित कर सकता हूं, लेकिन जब आपके पास आईसीएस के साथ नेक्सस एस है, तो यह बटन अनावश्यक हो जाता है, क्योंकि नेक्सस एस में हार्डवेयर मेनू बटन है। – NiThDi

+0

बेहतर रिज़ॉल्यूशन http://stackoverflow.com/questions/16092431/check-for-navigation-bar –

उत्तर

90
ViewConfiguration.get(context).hasPermanentMenuKey() 

अधिक जानकारी के लिए ViewConfiguration#hasPermanentMenuKey() देखें। ध्यान दें कि यह केवल एपीआई स्तर 14+ (एंड्रॉइड 4.0 आइस क्रीम सैंडविच या नए) के लिए उपलब्ध है।

+11

केवल एपीआई स्तर पर उपलब्ध>> 14 http://developer.android.com/reference/android/view/ViewConfiguration.html#hasPermanentMenuKey() – Palani

+1

एपीआई 11 - 13 पर आप मान सकते हैं कि मेन्यू मौजूद नहीं है। – fhucho

+1

@fhucho यह वास्तव में मेरी मदद नहीं करता है। मुझे एपीआई स्तर 10 ऊपर का समर्थन करने की आवश्यकता है, इसलिए यदि मैं इसका उपयोग करने का प्रयास करता हूं तो ग्रहण एक त्रुटि उठाता है। जब हार्डवेयर मेनू कुंजी होती है और इसलिए एक्शन बार पर कोई ओवरफ़्लो मेनू नहीं होता है तो मैं टोस्ट जारी करके अतिप्रवाह मेनू आइटम पर उपयोगकर्ता का ध्यान आकर्षित करना चाहता हूं। यह वास्तव में कष्टप्रद है कि अतिप्रवाह मेनू आइकन हमेशा हार्डवेयर मेनू कुंजी या नहीं होने पर ध्यान दिए बिना नहीं दिखाया जाता है। (मैं आपकी आखिरी टिप्पणी को समझ नहीं पा रहा हूं।) –

3

हनीकॉम चलाने वाले उपकरणों पर भी और बाद में, सिस्टम 2.x एंड्रॉइड के संस्करणों के लिए लिखे गए ऐप्स के लिए "मेनू बटन" प्रदान करेगा। केवल इसे "ओवरफ्लो मेनू" कहा जाता है। तो इस बात की कोई बात नहीं है कि क्या ऐसा बटन होगा या नहीं - अगर इसकी आवश्यकता हो तो यह वहां होगा।

एक सामान्य दिशानिर्देश के रूप में, आपको विशिष्ट कार्यक्षमता की जांच करनी चाहिए, सिस्टम/एपीआई संस्करण संख्याओं को न देखें। यदि यह उपलब्ध है तो एक्शनबार क्लास का उपयोग करें, अन्यथा 2. x विकल्प मेनू पर फ़ॉलबैक करें।

क्या आपने Google’s action-bar tutorial पर देखा है? यह स्पष्ट करता है कि आपको क्या करना चाहिए।

+3

इसका उल्लेख करना भूल गया: बेशक मैंने पहले विरासत मोड की कोशिश की, लेकिन इस मामले में, सूचीदृश्य प्रदर्शन गायब होने के कारण वास्तव में भयानक है हार्डवेयर का त्वरण। और जैसे ही आप टैगेटएसडीके को 14 पर सेट करते हैं, आपके पास फिर से हार्डवेयर त्वरण होगा, लेकिन ओवरफ़्लो मेनू नहीं होगा। यही कारण है कि मैं यूआई में सीधे मेनू बटन प्रदर्शित करता हूं, लेकिन अगर डिवाइस में हार्डवेयर मेनू बटन है तो मैं इसे छिपाना चाहता हूं। – NiThDi

+0

यदि सिस्टम में एक्शनबार श्रेणी है, तो मेनू/"ओवरफ़्लो" बटन केवल तभी दिखाया जाता है जब आपका ऐप एक्शनबार-अनजान है (जो आपके मामले में गलत होगा)। तो यह जांचने के बजाय कि ऐसा बटन कहां है, जांचें कि क्या एक्शनबार वर्ग उपलब्ध है या नहीं। –

+4

@ लॉरेंस डी ओलिविरो: यह पूरी तरह से सही नहीं है। यदि विषय पूर्णस्क्रीन पर सेट है, तो किसी भी एंड्रॉइड संस्करण में किसी भी डिवाइस पर एक्शनबार प्रदर्शित नहीं होता है। इसका मतलब है कि कोई हार्डवेयर मेनू बटन वाले डिवाइस पर विकल्प मेनू/एक्शनबार/ओवरफ़्लो पहुंच योग्य नहीं होगा। विषय को पूर्णस्क्रीन में सेट करने से सभी उपकरणों पर गतिविधियां प्रदर्शित होंगी जैसे कि वे प्री-हनीकॉम हैं।एक शीर्षक पट्टी प्रदर्शित करने के लिए सेट किए गए विषयों के लिए भी यही सच है, इसलिए, पूर्णस्क्रीन मोड या नोटिटलबार मोड में चल रहे ऐप्स के लिए, हार्डवेयर मेनू की जांच आवश्यक है और, फ़ॉलबैक प्रदान करने की आवश्यकता है। – mrd

1

मुझे लगता है कि एक संभावित और बेहतर समाधान एक स्वयं की एक्शनबार जोड़ना है। तो हर डिवाइस इसे देख सकता है और आपको हार्डवेयर कॉन्फ़िगरेशन या एपीआई संस्करण की जांच करने की आवश्यकता नहीं है।

23
if(Build.VERSION.SDK_INT <= 10 || (Build.VERSION.SDK_INT >= 14 &&  
           ViewConfiguration.get(this).hasPermanentMenuKey())) 
{ 
    // menu key is present 
} 
else 
{ 
    //No menu key 
} 
+0

यह गलत है!। 11 से कम एपीआई के लिए, यह दुर्घटनाग्रस्त हो जाएगा क्योंकि यह "hasPermanentMenuKey()" फ़ंक्शन को कॉल नहीं कर सकता है। ऐसा इसलिए है क्योंकि यह एपीआई 14 और ऊपर से मौजूद है। –

+7

जहां तक ​​मैं कह सकता हूं, यह कॉलमैनेंटमेनूकी() को कॉल नहीं करेगा क्योंकि चेक> = 14 असफल हो जाएगा और कॉल नहीं किया जाएगा। यह हर बार जब मैं एक एपीआई विशिष्ट विधि का उपयोग करता हूं, तो मैं हमेशा इसे संभालने के लिए एक विधि xxV14() बना देता हूं ताकि मैं अन्य कॉलों के बारे में चिंता किए बिना चेतावनी को सही ढंग से अनदेखा कर सकूं। – 3c71

+0

हां, 'Build.VERSION.SDK_INT> = 14' को बाकी के मूल्यांकन के लिए सत्य होना होगा। ध्यान दें कि हनीकॉम (एपीआई 11-13) केवल टैबलेट पर उपलब्ध था, और उनसे मेनू बटन होने की उम्मीद नहीं थी। इस प्रकार, यदि आपका लक्ष्य यह तय करना है कि यूआई में मेनू बटन दिखाना है या नहीं, तो यह कोड सभी एपीआई संस्करणों पर काम करना चाहिए। एकमात्र अवांछित प्रभाव तब होगा जब आपको कभी भी एक भौतिक मेनू बटन के साथ हनीकॉम्ब टैबलेट का सामना करना पड़ेगा (सुनिश्चित नहीं है कि कोई मौजूद है), और यह मुद्दा कॉस्मेटिक होगा। यह भी देखें http://android-developers.blogspot.de/2012/01/say-goodbye-to-menu-button.html। – user149408

-1

आप किसी संसाधन क्वालीफायर, मामला हो सकता है, क्योंकि आप UI के फ़र्क करना चाहते हैं, keyssoft संसाधन क्वालीफायर का उपयोग करें।

+0

चाबॉफ़्ट क्वालीफायर का उपयोग हार्डवेयर कीबोर्ड का पता लगाने के लिए किया जाता है जो नेविगेशन बार नहीं है। – lionello

1

चाबियाँ क्वालीफायर का उपयोग हार्डवेयर कीबोर्ड का पता लगाने के लिए किया जाता है जो नेविगेशन बार नहीं है।

यह लेख यह हल करती है:

Check for navigation bar

+0

अब तक का सबसे अच्छा समाधान ... (एंड्रॉइड 2.2 के लिए काम कर रहा है) –

संबंधित मुद्दे