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>直接插入到主题样式中,但没有任何效果。
有什么想法吗?

4

4 回答 4

19

即使您找到了解决方法,也可能对其他人有所帮助。我在 xml 中找到了一种简单的方法(logcat 的答案是指什么)。我使用的技巧是为我的菜单/操作栏图标创建自定义属性。每个菜单项图标必须有一个属性。

您需要attrs.xml在您的values文件夹中创建,并添加您的自定义属性。将每个属性视为您的主题/样式设置的常量,然后您的样式/视图可以使用这些内容来设置属性。

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

在您styles.xmlvalues文件夹中,让您的主题/样式将您的自定义图标属性设置为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_name].xmlmenu文件夹中,让您的菜单项将其图标设置为匹配的自定义图标属性。

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

现在,根据设置的主题,菜单项的图标将发生变化。此外,这允许您仍然拥有 API 特定版本的可绘制对象(浅色和深色),使用资源标识符与您的drawable文件夹,因此您可以在 3.0 之前使用不同的菜单样式图标和 3.0+ 的操作栏样式图标。

另外,请记住在运行时(vs AndroidManifest.xml)设置主题时,必须在setContentView()调用Activity. 建议在更改Activity已创建的主题后重新启动您的活动。

于 2013-01-30T16:14:43.390 回答
2

我认为您没有获得主题:) 当您尝试这样做时:

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

您正在尝试重载主题中名为“@drawable/action_search”的某些属性

我有坏消息要告诉你,我认为没有这样的。所以你可以去主题 Theme.Sherlock.ForceOverflow 和它的父母,看看你可以重载什么。

如果对您没有任何帮助,并且您想在主题中为不同的图标设置自定义属性,那就是不同的主题。您需要在 attrs.xml 中创建属性,将您的图标源指向这个新属性并在主题中定义属性值。对于每个不同的按钮。

于 2012-10-06T17:12:32.147 回答
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;
    }
于 2012-10-06T17:29:08.140 回答
0

请参阅res/xml/ic_search.xml文 AppCompat — 矢量时代 (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>
于 2016-07-29T05:07:58.237 回答