根据样式更改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>直接插入到主题样式中,但没有成功
有什么想法吗?

即使你找到了一个变通方法,也许这会帮助其他人。我在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+版本的操作栏样式图标。

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

我想你没有得到主题:)当你试图做:

<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;
}

请参阅博客文章AppCompat中的res/xml/ic_search.xml—矢量的年龄(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>

相关内容

  • 没有找到相关文章

最新更新