it-swarm.com.ru

Android: Appcompat 21, как добавить тень на панели действий

Я добавляю новую панель действий дизайна материала из нового appcompat и использую новый виджет панели инструментов. Я установил пользовательский фон на панели инструментов на xml, но моя проблема в том, что тень от панели действий не отображается. Ты знаешь как это сделать?

Код панели инструментов

<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/my_awesome_toolbar"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:minHeight="?attr/actionBarSize"
    Android:background="@drawable/ab_background_textured"
    app:theme="@style/MyTheme"
    app:popupTheme="@style/MyTheme.Popup"/>

Стиль MyTheme

<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="Android:textColorPrimary">@color/abc_primary_text_material_dark</item>
    <item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
    <item name="Android:textColorSecondary">#ffff8800</item>
</style>

Стиль MyTheme.Popup

<style name="MyTheme.Popup" parent="ThemeOverlay.AppCompat.Dark">
    <item name="Android:textColor">#ffffff</item>
</style>

Обновление

Как @Justin Пауэлл предложил добавить actionBarStyle в мою тему, но тени по-прежнему нет.

Стиль MyTheme (Обновлено)

<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="Android:textColorPrimary">@color/abc_primary_text_material_dark</item>
    <item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
    <item name="Android:textColorSecondary">#ffff8800</item>
    <item name="Android:actionBarStyle">@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse</item>
</style>
20
user3907002

Я нашел решение в приложении Google IO приемлемым для себя, но не увидел ни блога, ни поста Stackoverflow, полностью его объясняющего. Что вы можете сделать, так это получить свой лицензированный Apache 2 теневой ресурс ящика с https://github.com/google/iosched/blob/master/Android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png а затем в макете вашей деятельности:

<RelativeLayout Android:layout_width="match_parent"
                Android:layout_height="match_parent">
    <include Android:id="@+id/toolbar"
             layout="@layout/toolbar"/>

    <FrameLayout Android:layout_width="match_parent"
                 Android:layout_height="match_parent"
                 Android:layout_below="@id/toolbar"
                 Android:foreground="@drawable/header_shadow">
    <!-- YOUR STUFF HERE -->
    </FrameLayout>
</RelativeLayout>

Принимая во внимание, что тень заголовка

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="header_shadow" type="drawable">@drawable/bottom_shadow</item>
</resources>

для уровней API <21. Так же, как https://github.com/google/iosched/blob/master/Android/src/main/res/values/refs.xml и https://github.com/google/iosched/ blob/master/Android/src/main/res/values-v21/refs.xml .

И, чтобы быть сложным, вот toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="?attr/colorPrimary"
        Android:elevation="4dp"
        app:theme="@style/ToolbarTheme"
        app:popupTheme="@style/AppTheme"/>
34
Fabian Frank

Для макетов до 5.0 вы можете добавить тень обратно к содержимому под панелью инструментов, добавив foreground="?android:windowContentOverlay" к FrameLayout содержимого.

Например:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
>

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:minHeight="?attr/actionBarSize"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

<FrameLayout
    Android:id="@+id/fragmentContainer"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:foreground="?android:windowContentOverlay"
    />

</LinearLayout>
30
Billy

Вот как я отображаю тень: 

<!-- API level 21 and above then the elevation attribute is enough. For some reason it can't be set directly on the include so I wrap it in a FrameLayout -->
<FrameLayout
    Android:id="@+id/topwrapper"
    Android:background="@color/theme_primary"
    Android:elevation="4dp"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <include layout="@layout/toolbar_actionbar" />
</FrameLayout>

<FrameLayout
    Android:layout_below="@id/topwrapper"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <WebView
        Android:id="@+id/webview"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />
    <!-- This topshadow is hidden in code for API level 21 and above -->
    <include layout="@layout/topshadow" />
</FrameLayout>

И тогда макет верхней тени выглядит следующим образом (отрегулируйте 5dp, чтобы получить желаемую высоту тени): 

<View xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="5dp"
    Android:id="@+id/shadow_prelollipop"
    Android:background="@drawable/background_shadow" />

background_shadow.xml

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="rectangle">

    <gradient
        Android:startColor="#02444444"
        Android:endColor="#33111111"
        Android:angle="90"></gradient>
</shape>

toolbar_actionbar.xml

<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:myapp="http://schemas.Android.com/apk/res-auto"
    myapp:theme="@style/ActionBarThemeOverlay"
    myapp:popupTheme="@style/ActionBarPopupThemeOverlay"
    Android:id="@+id/toolbar_actionbar"
    Android:background="@color/theme_primary"
    myapp:titleTextAppearance="@style/ActionBar.TitleText"
    myapp:contentInsetStart="?actionBarInsetStart"
    Android:layout_width="match_parent"
    Android:layout_height="?actionBarSize" />
12
Christer Nordvik

actionbar_background.xml

 

    <item>
        <shape>
            <solid Android:color="@color/black" />
            <corners Android:radius="2dp" />
            <gradient
                Android:startColor="@color/black"
                Android:centerColor="@color/black"
                Android:endColor="@color/white"
                Android:angle="270" />
        </shape>
    </item>

    <item Android:bottom="3dp" >
        <shape>

            <solid Android:color="#ffffff" />
            <corners Android:radius="1dp" />
        </shape>
    </item>
</layer-list>

добавить к фону actionbar_style

<style name="Theme.ActionBar" parent="style/Widget.AppCompat.Light.ActionBar.Solid">
    <item name="background">@drawable/actionbar_background</item>
    <item name="Android:elevation">0dp</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:layout_marginBottom">5dp</item>
    <item name="logo">@drawable/ab_logo</item>
    <item name="displayOptions">useLogo|showHome|showTitle|showCustom</item>
</style>

добавить в Basetheme

  <style name="BaseTheme" parent="Theme.AppCompat.Light">
            <item name="Android:homeAsUpIndicator">@drawable/home_back</item>
            <item name="actionBarStyle">@style/TFKBTheme.ActionBar</item>
    </style>
0
Samet öztoprak