Изменение значков меню 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>