我想使用不同的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>
直接插入主题样式,但没有任何效果。
有什么想法?
答案 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>