6

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>ましたが、何も機能しませんでした。
どのようにアイデアはありますか?

4

4 に答える 4

19

回避策を見つけたとしても、これは他の誰かを助けるかもしれません。私はこれをxmlで行う簡単な方法を見つけました(logcatの答えが参照しているもの)。私が使用したトリックは、メニュー/アクションバーアイコンのカスタム属性を作成することでした。メニュー項目アイコンごとに1つの属性が必要です。

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"/>

これで、設定されているテーマに応じて、メニュー項目のアイコンが変わります。また、これにより、フォルダーでリソースIDを使用してドローアブルのAPI固有のバージョン(明るい色と暗い色)を引き続き使用drawableできるため、3.0より前のメニュースタイルアイコンと3.0以降のアクションバースタイルアイコンを使用できます。

また、実行時にテーマを設定する場合(vs AndroidManifest.xml)、を呼び出す前にテーマを設定する必要があることを忘れないsetContentView()でくださいActivityActivityすでに作成されているテーマを変更した後、アクティビティを再開することをお勧めします。

于 2013-01-30T16:14:43.390 に答える
2

私はあなたがテーマを取得していないと思います:)あなたがやろうとしているとき:

<style name="customActionButtonStyleDark" >
    <item name="@drawable/action_search">@drawable/action_search</item>
</style>

「@drawable/action_search」という名前のテーマの属性をオーバーロードしようとしています

私はあなたに悪い知らせがあります、私はそのようなものはないと思います。したがって、テーマ Theme.Sherlock.ForceOverflow とその親に移動して、オーバーロードできるものを確認できます。

何も役に立たず、テーマにさまざまなアイコンのカスタム属性を設定したい場合は、別のトピックです。attrs.xml で属性を作成し、アイコン ソースをこの新しい属性にポイントし、テーマで属性値を定義する必要があります。異なるボタンごとに。

于 2012-10-06T17:12:32.147 に答える
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;
    }
于 2012-10-06T17:29:08.140 に答える