Изменение значков меню 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> прямо в стиле темы, но ничего не получалось.
Есть идеи как?

4 ответов


даже если вы нашли решение, может быть, это поможет кому-то еще. Я нашел простой способ сделать это в xml (на что ссылается ответ logcat). Трюк, который я использовал, состоял в создании пользовательских атрибутов для моих значков меню/actionbar. У вас должен быть один атрибут на значок элемента меню.

вам нужно создать 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"/>

теперь, в зависимости от того, какая тема установлена, значок для пункта меню изменится. Кроме того, это позволяет вам по-прежнему иметь API-интерфейс версии ваших drawables (светлые и темные) с использованием идентификаторов ресурсов с вашим drawable папки, так что вы можете иметь различные иконки стиля меню для pre 3.0 и actionbar иконки стиля для 3.0+.

кроме того, помните при установке темы во время выполнения (vs AndroidManifest.xml), вы должны установить перед вызовом setContentView() в своем Activity. Рекомендуется перезапустить свою деятельность после изменения темы Activity это уже было создано.


Я думаю, что вы не получили theming:) когда вы пытаетесь сделать:

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

вы пытаетесь перегрузить некоторый атрибут в теме с именем "@drawable / action_search"

У меня плохие новости для вас, я думаю, нет такого. Таким образом, Вы можете перейти к теме темы.Шерлок.ForceOverflow и это родители и посмотреть, что вы можете перегрузить.

Если вам ничего не помогает, и вы хотите иметь пользовательский атрибут в своей теме для разных значков, это другая тема. Вы необходимо создать атрибут в attrs.xml, укажите источник значка на этот новый атрибут и определите значение атрибута в теме. Для каждой кнопки.


решил его, но отказался от него, чтобы попробовать его с 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;
    }

посмотреть res/xml/ic_search.xml в блоге AppCompat-возраст векторов (Крис Барнс)

обратите внимание на ссылку ?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>