2012-10-06 18 views
6

के आधार पर एक्शनबार मेनू आइकन बदलें, मैं किस शैली का उपयोग (डार्क या लाइट) के आधार पर विभिन्न ActionBar आइकन का उपयोग करना चाहता हूं। मैं यह पता लगा सकता है कि कैसे, मैं यहाँ क्या करने की कोशिश की:स्टाइल

<style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow"> 
     <item name="android:actionButtonStyle">@style/customActionButtonStyleDark</item> 
     <item name="actionButtonStyle">@style/customActionButtonStyleDark</item> 
    </style> 

    <style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow"> 
     <item name="android:actionButtonStyle">@style/customActionButtonStyleLight</item> 
     <item name="actionButtonStyle">@style/customActionButtonStyleLight</item> 
    </style> 

    <style name="customActionButtonStyleDark" > 
     <item name="@drawable/action_search">@drawable/action_search</item> 
    </style> 

    <style name="customActionButtonStyleLight" > 
     <item name="@drawable/action_search">@drawable/action_search_light</item> 
    </style> 

मैं भी <item name="@drawable/action_search">@drawable/action_search</item> विषय शैली में सीधे सम्मिलित करने की कोशिश की, लेकिन कुछ भी काम किया।
कोई विचार कैसे?

उत्तर

1

यह हल है, लेकिन यह छोड़ दिया एक्सएमएल के साथ प्रयास करने के लिए, मैं इसे अब प्रोग्राम के रूप में किया था:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     SharedPreferences prefs = getSharedPreferences("app", 0); 
     boolean isDark = "Dark".equals(prefs.getString("theme", "Dark")); 

     com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 

     // set Icons 
     menu.findItem(R.id.menuitem_search).setIcon(isDark ? R.drawable.action_search : R.drawable.action_search_light); 
     menu.findItem(R.id.menuitem_add).setIcon(isDark ? R.drawable.content_new : R.drawable.content_new_light); 
     menu.findItem(R.id.menuitem_share).setIcon(isDark ? R.drawable.social_share : R.drawable.social_share_light); 
     return true; 
    } 
2

मुझे लगता है कि आप थीम नहीं मिला :) जब आप ऐसा करने के लिए कोशिश कर रहे हैं:

<style name="customActionButtonStyleDark" > 
    <item name="@drawable/action_search">@drawable/action_search</item> 
</style> 

आप नाम के साथ विषय में कुछ विशेषताओं को ओवरलोड की कोशिश कर रहे "@ drawable/action_search"

मेरे पास है आपके लिए बुरी खबर, मुझे लगता है कि ऐसा कोई नहीं है। तो आप विषय पर जा सकते हैं Theme.Sherlock.ForceOverflow और यह माता-पिता हैं और देखें कि आप क्या अधिभार कर सकते हैं।

यदि कुछ भी आपकी मदद नहीं करता है, और आप अलग-अलग आइकन के लिए अपनी थीम में कस्टम विशेषता चाहते हैं, तो यह अलग-अलग विषय है। आपको attrs.xml में विशेषता बनाने की आवश्यकता है, अपने आइकन स्रोत को इस नई विशेषता पर इंगित करें और थीम में विशेषता मान परिभाषित करें। हर अलग बटन के लिए।

18

भले ही आप कोई समाधान मिल गया है, शायद यह किसी और में मदद मिलेगी। मुझे एक्सएमएल में ऐसा करने का एक आसान तरीका मिला (किस लॉकैट का जवाब जिक्र कर रहा है)। मैं जिस चाल का उपयोग करता था वह मेरे मेनू/एक्शनबार आइकन के लिए कस्टम विशेषताओं को बनाना था। आपके पास मेनू आइटम आइकन प्रति एक विशेषता होनी चाहिए।

आपको अपने values फ़ोल्डर में attrs.xml बनाने की आवश्यकता है, और अपने कस्टम विशेषताओं को जोड़ें। प्रत्येक विशेषता के बारे में सोचें कि आपके थीम/शैलियों को सेट किया गया है, और फिर आपकी शैलियों/विचार गुणों को सेट करने के लिए उन प्रतियोगिताओं का उपयोग कर सकते हैं।

<declare-styleable name="customAttrs"> 
    <attr name="customSearchIcon" format="reference" /> 
</declare-styleable> 

अपने values फ़ोल्डर में अपने styles.xml में, अपने विषयों/शैलियों कि सेट अपने कस्टम आइकन drawable संदर्भ का श्रेय है।

<style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow"> 
    <item name="customSearchIcon">@drawable/action_search</item> 
</style> 

<style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow"> 
    <item name="customSearchIcon">@drawable/action_search_light</item> 
</style> 

अन्त में, में अपने menu फ़ोल्डर में अपने [menu_name].xml, अपने मेनू आइटम अपने मिलान कस्टम आइकन विशेषता के लिए अपने आइकन निर्धारित की है।

<item 
    android:id="@+id/menuitem_search" 
    android:icon="?attr/customSearchIcon"/> 

अब, थीम सेट करने के आधार पर, मेनू आइटम के लिए आइकन बदल जाएगा। साथ ही, यह आपके drawable फ़ोल्डरों के साथ संसाधन पहचानकर्ताओं का उपयोग करके आपके ड्रॉबल्स (प्रकाश और अंधेरे) के एपीआई विशिष्ट संस्करणों को अभी भी प्राप्त करने की अनुमति देता है, ताकि आपके पास 3.0+ के लिए प्री 3.0 और एक्शनबार शैली आइकन के लिए अलग मेनू शैली आइकन हो सकें।

साथ ही, रनटाइम पर थीम सेट करते समय याद रखें (बनाम AndroidManifest.xml), आपको में setContentView() पर कॉल करने से पहले इसे सेट करना होगा। Activity की थीम को बदलने के बाद आपकी गतिविधि को पुनरारंभ करने की अनुशंसा की जाती है जो पहले से ही बनाई जा चुकी है।

+0

यह ठीक काम कर रहा है के लिए, चलो धन्यवाद! लेकिन जावा से इसका उपयोग कैसे करें? जब मैं menuLetters.setIcon (R.attr.ic_action_messages) को कॉल करता हूं; मुझे त्रुटि मिलती है कि संसाधन नहीं मिला। – BArtWell

+2

अच्छा सवाल, मुझे लगता है कि जवाब [यहां] है (http://stackoverflow.com/questions/8793183/access-resource-defined-in-theme-and-attrs-xml-android)। चाल यह प्रतीत होती है कि आपको एंड्रॉइड को यह बताना है कि वर्तमान में कौन सी थीम सेट की गई है, इसलिए यह जानता है कि किस स्टाइल संसाधन को पकड़ना है। –

+0

हाँ, आप सही हैं, यह भी ठीक काम कर रहा है। धन्यवाद! – BArtWell

0

res/xml/ic_search.xml देखें ब्लॉग पोस्ट में AppCompat — Age of the vectors (Chris Barnes)

सूचना संदर्भ ?attr/colorControlNormal

<vector xmlns:android="..." 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0" 
    android:tint="?attr/colorControlNormal"> 
    <path 
     android:pathData="..." 
     android:fillColor="@android:color/white"/> 
</vector> 
संबंधित मुद्दे