Как у меня есть тень на моем 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, он ничего не меняет. Может ли кто-нибудь помочь, что делать?

Ответы

Ответ 1

Если вы хотите создать тень ниже ActionBar, вам нужно установить параметр android:windowContentOverlay в теме приложения (в коде вы неправильно устанавливаете его в стиле ActionBar).

В вашем примере это будет:

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

Использование значения @null удаляет тень.

Эта одна строка устанавливает тень на ActionBar на Android 3.0 и новее. Однако, если вы используете ActionBarSherlock, он не будет работать так, как вы ожидаете. Это создало бы тень поверх окна над ActionBarSherlock на Android-устройствах, на которых установлена ​​система старше Android 4.0 (хотя ActionBar присутствует в api с Android 3.0, ActionBarSherlock использует пользовательскую реализацию для всех версий 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 на таких устройствах. Итак, как объединить эти два параметра, чтобы получить желаемую тень как в ActionBar, так и в ActionBarSherlock?

Используйте квалификаторы конфигурации ресурсов, в вашем случае используйте квалификаторы версии платформы. В res/values/styles.xml используйте второй код xml. И в res/values-v14/styles.xml используйте первый xml-код. Поэтому версия ActionBarSherlock используется по умолчанию (для версий до Android 4.0), а версия ActionBar используется для Android 4.0 и новее.

Edit: В Android 4.3 (API уровня 18) есть ошибка , android:windowContentOverlay не работает. Он должен быть исправлен в будущем выпуске. В случае, если это необходимо для Android 4.3, вы можете найти обходные пути, связанные с сообщением об ошибке.

Ответ 2

Как и в предыдущем ответе, используйте "windowContentOverlay" в теме приложения, а не стиль панели действий.

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

Если вы хотите реалистичную тень, вы можете найти ее в "Ваша Android-папка" /platform/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>

Ответ 3

Кроме того, выше API21 (Lollipop), вам также понадобится это в коде.

getSupportActionBar().setElevation(0);