我在SherlockActionBar的紫色背景上有一组白色图标
我想让它们在点击时变成深紫色。
我有深紫色的相同图标,所以我想让那些drawable出现在按下状态。
现在,我知道如何在整个应用程序主题中执行此操作,但这意味着我必须对所有图标使用相同的drawable。
我想知道如何为每个项目的按下状态分配不同的drawable。
以下是我现在使用的代码:
在styles.xml中
<style name="Theme.SherlockCustom" parent="@style/Theme.Sherlock.Light">
<item name="actionBarItemBackground">@drawable/action_bar_item_background</item>
<item name="android:icon">@android:color/transparent</item>
<item name="displayOptions">showCustom</item>
<item name="android:minWidth">0dp</item>
<item name="android:padding">0dp</item>
</style>
action_bar_item_background.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/light_purple" android:state_pressed="true"/>
<!-- pressed -->
<item android:drawable="@android:color/transparent"/>
<!-- default -->
</selector>
这是不起作用的部分(尝试设置定义特定按钮的新外观的样式):
feed_icon.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/ic_action_content_paste"
android:right="@dimen/action_bar_icons_padding_right"
android:theme="@style/feediconstyle"></item>
</layer-list>
和style / feediconstyle:
<style name="feediconstyle" parent="@style/Theme.Sherlock.Light">
<item name="actionBarItemBackground">@drawable/feed_icon_background</item>
<item name="displayOptions">showCustom</item>
</style>
此特定图标不符合新样式,即
feed_icon_background:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/feed_icon_purple" android:state_pressed="true"/>
<!-- pressed -->
<item android:drawable="@android:color/transparent"/>
<!-- default -->
</selector>
那我该怎么办?
答案 0 :(得分:8)
我想获得资格“我还没有使用ActionBarSherlock仅使用标准操作栏检查此内容”
那就是说我知道这可以在标准的操作栏上运行,并且没有理由在ActionBarSherlock中没有它。
在我的活动的onCreate中(我使用的是logo属性,但它也适用于MenuItems)
getActionBar().setLogo(R.drawable.logo);
getActionBar().setDisplayUseLogoEnabled(true);
getActionBar().setHomeButtonEnabled(true);
在logo.xml中我有一个选择器
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/logopressed"/>
<item android:drawable="@drawable/logonotpressed" />
</selector>
在logopressed.xml中可以使用图层列表来制作背景
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@android:color/holo_purple" />
<item
android:drawable="@drawable/logo_normal" />
</layer-list>
在logonotpressed.xml中,根据需要切换背景颜色和/或图标
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@android:color/white" />
<item
android:drawable="@drawable/logo_inverted" />
</layer-list>
所以这个解决方案的关键是设置选择器drawable并让它为每个状态选择一个全新的drawable,而不是将一个选择器设置为一个静态变量的背景属性
注意:您应该可以使用背景来设置主题,而不是使用2层,但我无法使其工作
答案 1 :(得分:0)
我只是在ActionBar
中使用自定义视图。您可以通过覆盖onCreateOptionsMenu(Menu)
中的Activity
来完成此操作,并将Button
设置为操作视图。我还使用MenuItemCompat
库中的NineOldAndroids
来使用 API 2.2(Froyo)及以上版本:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu);
MenuItem feed = menu.findItem(R.id.feed);
Button feedButton = new Button(this);
//here set the custom statelist (selector)
feedButton.setBackgroundResource(R.drawable.feed_icon_background);
MenuItemCompat.setActionView(feed, feedButton);
//ensure the clicks are handled correctly in the Activity
feedButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onOptionsItemSelected(feed);
}
});
return true;
}