4

SherlockActionBar の紫色の背景に白いアイコンのセットがあります

クリックすると濃い紫色になりたいです。

濃い紫色の同じアイコンがあるので、それらのドローアブルが押された状態で表示されるようにしたいと思います。

これで、アプリケーション テーマ全体でこれを行う方法はわかりましたが、これは、すべてのアイコンに同じドローアブルを使用する必要があることを意味します。

各アイテムの押された状態に異なるドローアブルを割り当てる方法を知りたいです。

これが私が今使っているコードです:

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 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 で (ロゴ属性を使用していますが、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>

したがって、このソリューションの核心は、セレクター ドローアブルを設定し、それ以外の場合は静的変数の背景属性にセレクター ドローアブルを設定するのではなく、状態ごとにまったく新しいドローアブルを選択させることです。

注:2つのレイヤーを実行する代わりに、背景を使用してアイテムのテーマを設定できるはずですが、これを機能させることができませんでした

于 2013-10-19T00:52:56.527 に答える
0

でカスタム ビューを使用するだけActionBarです。これを行うには、 をオーバーライドonCreateOptionsMenu(Menu)し、 aをAction ViewActivityとして設定します。また、 API 2.2 (Froyo) 以降でこれを機能させるためにライブラリで使用します。ButtonMenuItemCompatNineOldAndroids

@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 に答える