4

我在 SherlockActionBar 中有一组紫色背景的白色图标

我想让它们在被点击时变成深紫色。

我有相同的深紫色图标,所以我想让这些drawables出现在按下状态。

现在,我知道如何在整个应用程序主题中执行此操作,但这意味着我必须对所有图标使用相同的可绘制对象。

我想知道如何为每个项目的按下状态分配不同的可绘制对象。

这是我现在使用的代码:

在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>

和风格/ 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>

那么我该怎么做呢?

4

2 回答 2

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,而不是将选择器drawable设置为其他静态变量的背景属性

注意:您应该能够使用背景而不是做 2 层来为项目设置主题,但我无法让它工作

于 2013-10-19T00:52:56.527 回答
0

我只是在ActionBar. 您可以通过覆盖onCreateOptionsMenu(Menu)您的Activity, 并将 a 设置ButtonAction View来做到这一点。我还在MenuItemCompatNineOldAndroids中使用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;
}
于 2013-10-20T06:46:56.340 回答