根据样式更改ActionBar菜单图标

时间:2012-10-06 16:40:59

标签: android styles android-actionbar actionbarsherlock

我想使用不同的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 个答案:

答案 0 :(得分:19)

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

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

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

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

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

现在,根据设置的主题,菜单项的图标将会改变。此外,这允许您使用包含drawable文件夹的资源标识符仍然具有API特定版本的drawables(浅色和深色),因此您可以为3.0之前的3.0和3.0的操作栏样式图标设置不同的菜单样式图标。

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

答案 1 :(得分:2)

我认为你没有得到主题:)当你想要做的时候:

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

您正在尝试使用名称“@ drawable / action_search”

重载主题中的某些属性

我有坏消息,我认为没有。所以你可以去主题Theme.Sherlock.ForceOverflow和它的父母,看看你可以超载。

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

答案 2 :(得分: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;
    }

答案 3 :(得分:0)

请参阅博文AppCompat — Age of the vectors (Chris Barnes)

中的res/xml/ic_search.xml

请注意对?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>