2012-07-22 24 views
8

के माध्यम से एक्शन आइटम बटन प्रोग्रामेटिक रूप से दिखाएं/छुपाएं I ActionBarSherlock का उपयोग कर रहा हूं। मैं एक निश्चित उपयोगकर्ता ऑपरेशन के जवाब में एक्शन बार में दो बटन प्रदर्शित करने में सक्षम होना चाहता हूं। उपयोगकर्ता ऑपरेशन एक्शन बार से पूरी तरह से असंबंधित है। बटन को देखने के लिए बटन की दृश्यता को नियंत्रित करने की आवश्यकता है। साथ ही, उन बटनों पर क्लिक करने के लिए प्रतिक्रिया मेरे अपने आवेदन कोड द्वारा संभाला जाएगा।एक्शनबैरशेलॉक: एक विधि कॉल

बटन आदर्श रूप से android:showAsAction="ifRoom|withText" का उपयोग करते हुए एक्शन आइटम के रूप में मेनू आइटम को परिभाषित करते समय बनाए गए लोगों की तरह दिखेंगे, जैसा कि here सचित्र है।

मेरे समस्या यह है कि जहाँ तक मैं बता सकता हूँ, मानक ActionBar एपीआई दिखाने या होगा पर कार्रवाई मद बटन को छिपाने के लिए इस तरह का कोई तंत्र प्रदान करता है है, और केवल समय है कि मेनू आइटम परिभाषित किया जा सकता onCreateOptionsMenu() की है जो भीतर है सिस्टम द्वारा बुलाया पाठ्यक्रम।

मेरा विश्वास यह है कि मैं इस तरह के बटन जोड़ने और उन्हें दिखाने/छुपाने का एकमात्र तरीका उनके लिए कस्टम लेआउट बनाना और .setCustomView() का उपयोग एक्शन बार में रखने के लिए करना है। क्या लोग आम तौर पर उस से सहमत होंगे, या क्या मुझे कुछ याद आया है?

यदि मैं .setCustomView() का उपयोग करने के मार्ग पर जाता हूं, तो मैं अपने बटन को एक्शन आइटम बटन के समान दिखाना चाहता हूं जो एक्शनबारशेलॉक मेनू आइटम के लिए प्रदर्शित करता है जिसमें विशेषता android:showAsAction="ifRoom|withText" है। ऐसा करने के लिए, क्या कोई मुझे सलाह दे सकता है कि ActionBarSherlock लाइब्रेरी के भीतर से कौन सी विशेष थीम, शैली या लेआउट का उपयोग करना चाहिए? मैंने पहले से ही R.layout.abs__action_menu_item_layout का उपयोग करने का प्रयास किया है, लेकिन लेआउट में CapitalizingButton की मुद्रास्फीति का प्रयास करते समय colorStateList से संबंधित अपवाद उत्पन्न करने का प्रयास किया गया है।

उत्तर

9

यदि आप उन दो बटनों को मेनू आइटमों के स्वरूप और अनुभव के लिए चाहते हैं, तो आपको उन्हें मेनू आइटम बनाना चाहिए। आपकी धारणा है कि मेनू आइटम को केवल onCreateOptionsMenu() में परिभाषित किया जा सकता है, क्योंकि onPrepareOptionsMenu() नामक एक विधि भी है, जिसे मेनू दिखाए जाने से ठीक पहले हर बार बुलाया जाएगा। एक गतिविधि की invalidateOptionsMenu() विधि के साथ, आप आसानी से एक मेनू डेटा बना सकते हैं जो रीयलटाइम में वर्तमान स्थिति को दर्शाता है।

वैकल्पिक MenuItem ऑब्जेक्ट्स का संदर्भ रखने का विकल्प है, क्योंकि दस्तावेज उन लोगों को पकड़ने के लिए अपनी बचत करता है, और उपयुक्त होने पर उनकी दृश्यता बदलता है। मेनू को अपडेट करने के लिए आपको अभी भी invalidateOptionsMenu() पर कॉल करना होगा- मुझे अपने सिर के शीर्ष से याद नहीं है। (संपादित करें: जेक इस पर यह करने के लिए मुझे हरा)

व्यक्तिगत रूप से, मैं, पहले दृष्टिकोण पसंद करते हैं क्योंकि आप सभी मेनू से संबंधित तर्क एक साथ समूहीकृत रखने के लिए और दृश्यता स्थिति/मॉडल के कुछ प्रकार पर आधारित है। दूसरा विकल्प आपके वर्तमान कोड के आधार पर कार्यान्वित करने के लिए अधिक सरल हो सकता है, लेकिन परिणामस्वरूप पूरे स्थान पर मेनू-सामान हो सकता है।

+1

धन्यवाद, एमएच। यहां कई विचार हैं जिनके लिए मैं आभारी हूं। अभी भी एक मुद्दा है जो मुझे आश्चर्यचकित करता है अगर मुझे अभी भी '.setCustomView()' का सहारा लेना होगा। मुद्दा यह है कि मैं टेक्स्ट लेबल हमेशा दिखाना चाहता हूं, सिर्फ आइकन ही नहीं। मेरे एचटीसी वन एक्स पर ओवरफ्लो आइकन और एक एक्शन आइटम के अलावा एबीएस पर कुछ भी नहीं है, एक्शन आइटम का टेक्स्ट लेबल केवल परिदृश्य में प्रदर्शित होता है, भले ही अभिविन्यास में पर्याप्त जगह हो। मुझे एहसास है कि एक्शन बार स्क्रीन घनत्व और बार चौड़ाई के आधार पर तर्क लागू करता है यह निर्धारित करने के लिए कि लेबल दिखाई दे रहा है या नहीं। मैं थोड़ा और जांच करूँगा। – Trevor

+0

जुज़ ने आपके मेनू इटिम तर्क को आपके द्वारा दी गई सलाह का उपयोग करके टुकड़ों के भीतर दोबारा लिखा - अब बहुत बेहतर काम करता है। कोई भी इस तरह से जा रहा है - सेट हैसमेनूऑप्शन (सत्य) करना सुनिश्चित करें और @MH के रास्ते पर जाएं। सुझाव दिया गया है (मैं दोनों पर निर्भर करता हूं और मेनू मेनू ऑब्जेक्ट्स को संदर्भित करता हूं)। – kape123

+0

"व्यक्तिगत रूप से, मैं पहला दृष्टिकोण पसंद करता हूं, क्योंकि आप सभी मेनू-संबंधित तर्क को एक साथ समूहीकृत रखते हैं और दृश्यता कुछ प्रकार के राज्य/मॉडल पर आधारित होती है।" हां, सब कुछ एक साथ, भगवान वस्तु में, गतिविधि कहा जाता है। और भगवान वस्तु एक विरोधी पैटर्न है। –

11

MenuItem उदाहरणों पर आप setVisibility पर कॉल कर सकते हैं।

documentation states कि "आप सुरक्षित रूप से मेन्यू (और इससे बनाए गए किसी भी आइटम) पर सुरक्षित रूप से पकड़ सकते हैं, इसे वांछित रूप में संशोधित कर सकते हैं, अगली बार जब CreateOptionsMenu() को कॉल किया जाता है।"

+0

धन्यवाद, जेक (और एबीएस के लिए बहुत धन्यवाद - हालांकि आप अब तक इसके लिए धन्यवाद देने के थक गए हैं :-))। जैसा कि मैंने एमएच को टिप्पणी की, एक मुद्दा यह है कि मैं पाठ लेबल को हमेशा दिखाने के लिए मजबूर करना चाहता हूं। यह एक कारण है कि मुझे कस्टम दृश्य को लागू करने की आवश्यकता क्यों हो सकती है, लेकिन मैं पहले इनमें से कुछ सुझावों को आजमाउंगा। – Trevor

2

क्या आपने डेमो नमूने की जांच की है?

उनके पास "फीचर टॉगल" पर यह सुविधा है।

+0

बहुत धन्यवाद। मैं अभी उस नमूने पर एक नज़र डालेगा। – Trevor

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