2012-10-06 69 views
6

我想使用不同的ActionBar圖標取決於我使用的風格(黑色或淺色)。 我無法弄清楚如何,繼承人是我的嘗試:更改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

解決了這個問題,但放棄了用XML來試試吧,我做到了,現在編程:即使

@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> 

您試圖超載一些屬性,主題名稱爲「@繪製/ ACTION_SEARCH」

我有壞消息給你,我覺得沒有這樣的。所以你可以去主題Theme.Sherlock.ForceOverflow和它的父母,看看你可以超載。

如果沒有什麼幫助你,並且你想在你的主題中爲不同的圖標定製屬性,那是不同的主題。您需要在attrs.xml中創建屬性,將圖標源指向此新屬性並在主題中定義屬性值。爲每個不同的按鈕。

18

你找到一個解決辦法,也許這將幫助別人。我發現了一個簡單的方法來做到這一點在XML(什麼logcat的答案是指)。我使用的技巧是爲我的菜單/操作欄圖標創建自定義屬性。每個菜單項圖標必須有一個屬性。

您需要在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文件夾中的資源標識符仍然具有特定於API的特定版本(淺色和深色),因此您可以爲3.0以前的版本提供不同的菜單樣式圖標和3.0+的操作欄樣式圖標。

另外,請記住,在運行時設置主題(vs AndroidManifest.xml)時,必須先在的Activity之前設置它。建議在更改已創建的Activity的主題後重新啓動活動。

+0

這是工作的罰款,感謝的!但是如何從Java中使用它?當我調用menuLetters.setIcon(R.attr.ic_action_messages);我收到錯誤,找不到資源。 – BArtWell

+2

好問題,我想答案是[這裏](http://stackoverflow.com/questions/8793183/access-resource-defined-in-theme-and-attrs-xml-android)。這個技巧似乎是,你必須告訴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>