web-dev-qa-db-ja.com

ActionBar(ActionBarSherlock)にドロップシャドウを設定するにはどうすればよいですか?

スタイル付きのxmlレイアウトを含めています:

<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <style name="Theme.Styled" parent="Theme.Sherlock">
        <item name="actionBarStyle">@style/Widget.MyApp.ActionBar</item>
        <item name="Android:actionBarStyle">@style/Widget.MyApp.ActionBar</item>

    </style>

    <style name="Widget.MyApp.ActionBar" parent="Widget.Sherlock.Light.ActionBar">
        <item name="titleTextStyle">@style/Widget.MyApp.TitleTextStyle</item>
        <item name="background">@color/red</item>
        <item name="Android:background">@color/red</item>
        <item name="windowContentOverlay">@null</item>
        <item name="Android:windowContentOverlay">@null</item>
    </style>

    <style name="Widget.MyApp.TitleTextStyle" parent="TextAppearance.Sherlock.Widget.ActionBar.Title">
        <item name="Android:textColor">@color/white</item>
        <item name="Android:textSize">21sp</item>
    </style>

</resources>

インターネットでの検索の中には、windowContentOverlayを@nullに設定して使用することを示唆しているものがあります。しかし、スタイルxmlで使用しても、何も変更されません。誰かが何をすべきかを助けることができますか?

14
Debopam Mitra

ActionBarの下に影を作成する場合は、アプリケーションテーマにAndroid:windowContentOverlayパラメーターを設定する必要があります(コードでは、ActionBarスタイルに誤って設定しています)。

あなたの例では、次のようになります。

<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="Android:windowContentOverlay">@drawable/my_actionbar_shadow</item>
</style>

@null値を使用すると、影が削除されます。

この1行は、Android 3.0以降のActionBarに影を設定します。ただし、ActionBarSherlockを使用している場合は、期待どおりに機能しません。ウィンドウの上部に影が作成されます。 AndroidAndroid 4.0より古いシステムを実行しているデバイス)のActionBarSherlock(ただし、Android 3.0、ActionBarSherlock以降、ActionBarはAPIに存在しますすべてのAndroid Android 4.0)より古いバージョンにカスタム実装を使用します。

ActionBarSherlockの下にシャドウを作成するには、アプリケーションテーマにwindowContentOverlayパラメーターを設定する必要があります(Android:が欠落していることに注意してください)。

<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item>
</style>

繰り返しますが、@nullを使用すると、影が削除されます。

この行はActionBarSherlockで機能しますが、Android実行中のデバイスAndroid 4.0以降では機能しません。そのようなデバイスでは、ActionBarの下に影は作成されません。では、これら2つのパラメーターを組み合わせて、ActionBarとActionBarSherlockの両方で目的のシャドウを取得するにはどうすればよいでしょうか。

リソース構成修飾子 を使用します。この場合、プラットフォームバージョン修飾子を使用します。 res/values/styles.xmlで、2番目のxmlコードを使用します。そして、res/values-v14/styles.xmlでは、最初のxmlコードを使用します。したがって、ActionBarSherlockバージョンがデフォルトで使用され(Android 4.0より前のバージョンの場合)、ActionBarバージョンがAndroid 4.0以降のバージョンの場合)に使用されます。

編集:Android 4.3(APIレベル18)、Android:windowContentOverlayバグ があります動作しません。将来のリリースで修正される予定です。Android 4.3で修正が必要な場合は、バグレポートにリンクされている回避策を見つけることができます。

30
Tomik

以前の回答のように、アクションバースタイルではなく、アプリケーションテーマで「windowContentOverlay」を使用すると言っていました。

<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item>
</style>

リアルな影が必要な場合は、「Your Android Folder」/ platforms/Android-16/data/res/drawable-hdpi /」にあります。

ab_solid_shadow_holo.9.pngをdrawable-hdpiフォルダーにコピーすると、最終結果は次のようになります。

<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="windowContentOverlay">@drawable/ab_solid_shadow_holo</item>
</style>
5
Stefan

さらに、API21(Lollipop)の上では、これもコードで必要になります。

getSupportActionBar().setElevation(0);
3
Kevin Liu