ไม่มีเงาตามค่าเริ่มต้นใน Toolbar หรือไม่


165

ฉันกำลังอัปเดตแอปของฉันด้วย Toolbar ใหม่จากห้องสมุดสนับสนุน v21 ปัญหาของฉันคือแถบเครื่องมือไม่ได้สร้างเงาใด ๆ หากฉันไม่ได้ตั้งค่าแอตทริบิวต์ "ระดับความสูง" นั่นเป็นพฤติกรรมปกติหรือฉันกำลังทำอะไรผิดหรือเปล่า?

รหัสของฉันคือ:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical">

   <android.support.v7.widget.Toolbar
       xmlns:app="http://schemas.android.com/apk/res-auto"
       android:id="@+id/my_awesome_toolbar"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:background="?attr/colorPrimary"
       android:elevation="4dp"
       android:minHeight="?attr/actionBarSize"
       app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

   <FrameLayout
       android:id="@+id/FrameLayout1"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       .
       .
       .

และในกิจกรรมของฉัน - วิธีการสร้าง:

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

คุณเห็นสิ่งนี้ในอุปกรณ์ที่ใช้ Lollipop หรือไม่
rlay3

3
บนอุปกรณ์ที่ใช้ Lollipop แสดงเงาเนื่องจากแอตทริบิวต์การยกระดับ แต่ไม่ได้อยู่ใน KitKat หรือรุ่นที่เก่ากว่า นั่นเป็นพฤติกรรมที่คาดหวังสำหรับแอตทริบิวต์การยกระดับตามที่เอกสารอธิบาย แต่ฉันคาดหวังว่าโดยค่าเริ่มต้นหากไม่มีแอตทริบิวต์การยกระดับเงาจะมีลักษณะคล้ายกับ Action Bar ในทุกรุ่น
MrBrightside

ฉันโพสต์วิธีแก้ปัญหาที่เป็นไปได้ที่นี่: stackoverflow.com/a/26759202/553905
Billy

ใช้ / values ​​โฟลเดอร์และ styles.xml เพื่อใช้รหัสเงาที่เหมาะสมตามเวอร์ชันของระบบปฏิบัติการ (ดูด้านล่าง)
radley

คำตอบ:


252

ฉันสิ้นสุดการตั้งค่าเงาของฉันเองสำหรับแถบเครื่องมือคิดว่ามันอาจเป็นประโยชน์สำหรับทุกคนที่มองหา:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="top"
              android:orientation="vertical">

    <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
                                       android:layout_width="match_parent"
                                       android:layout_height="wrap_content"
                                       android:background="@color/color_alizarin"
                                       android:titleTextAppearance="@color/White"
                                       app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

    <FrameLayout android:layout_width="match_parent"
                 android:layout_height="match_parent">

        <!-- **** Place Your Content Here **** -->

        <View android:layout_width="match_parent"
              android:layout_height="5dp"
              android:background="@drawable/toolbar_dropshadow"/>

    </FrameLayout>

</LinearLayout>

@ drawable / toolbar_dropshadow:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
       android:shape="rectangle">

    <gradient android:startColor="@android:color/transparent"
              android:endColor="#88333333"
              android:angle="90"/>

</shape>

@ สี / color_alizarin

<color name="color_alizarin">#e74c3c</color>

ป้อนคำอธิบายรูปภาพที่นี่


3
อย่าลืมซ่อนมุมมองของคุณหากอุปกรณ์ที่คุณใช้คือ> = ถึง Lollipop หากไม่ใช่คุณจะจบลงด้วยเงาสองอัน
mradzinski

1
นี่เป็นวิธีที่ผิดไปเพราะคุณจะต้องลบมุมมองนั้นออกสำหรับเค้าโครง 5.0 ใช้ android: windowContentOverlay หรือ android: foreground แทน
radley

3
จาก Google เกี่ยวกับการออกแบบการออกแบบวัสดุ Toolbarคุณควรตั้งค่าสำหรับความสูงของเงาแทนandroid:layout_height="4dp" ที่จริงแล้วการยกระดับเป็นเช่นเดียวกับความสูงของเงาที่คุณตั้งอยู่บน5dp FrameLayout
Anggrayudi H

2
ฉันมีปัญหากับวิธีแก้ปัญหานี้เพราะฉันขยายโครงร่างกิจกรรมของฉันลงในโครงร่างเฟรมในตัวอย่างของคุณคุณคิดว่าวิธีนี้จะใช้งานได้หรือไม่?
Zach Sperske

2
แนะนำให้ใช้ "android: endColor =" # c7c7c7 "บน android: endColor =" # 88333333 "
Mohammad Faisal

211

Google เปิดตัวห้องสมุดสนับสนุนการออกแบบเมื่อไม่กี่สัปดาห์ที่ผ่านมาและมีทางออกที่ดีสำหรับปัญหานี้ในห้องสมุดนี้

เพิ่มไลบรารีการสนับสนุนการออกแบบเป็นการอ้างอิงในbuild.gradle:

compile 'com.android.support:design:22.2.0'

เพิ่มAppBarLayoutไลบรารีที่จัดทำโดยเป็น wrapper รอบToolbarโครงร่างของคุณเพื่อสร้างเงา

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
       <android.support.v7.widget.Toolbar
           .../>
    </android.support.design.widget.AppBarLayout>

นี่คือผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

มีลูกเล่นอื่น ๆ อีกมากมายพร้อมห้องสมุดสนับสนุนการออกแบบ

  1. http://inthecheesefactory.com/blog/android-design-support-library-codelab/en
  2. http://android-developers.blogspot.in/2015/05/android-design-support-library.html

AndroidX

ดังกล่าวข้างต้น แต่ด้วยการพึ่งพา:

implementation 'com.google.android.material:material:1.0.0'

และ com.google.android.material.appbar.AppBarLayout


26
การตั้งค่าAppBarLayoutเป็น wrapper รอบ ๆToolbarไม่ได้ตั้งค่าเงาใด ๆ สำหรับฉัน โปรดทราบว่าฉันไม่ได้ใช้ลิ้นชักนำทาง ความคิดเห็นใด ๆ เกี่ยวกับสาเหตุที่ใช้ไม่ได้
avb

@ avb1994 ไม่สามารถพูดได้อย่างแน่นอนฉันได้ทดสอบโดยไม่ต้องใช้ลิ้นชัก nav คุณสามารถโพสต์เป็นคำถามด้วยไฟล์เลย์เอาต์ได้หรือไม่?
Binoy Babu

ดูคำถามของฉัน: stackoverflow.com/questions/31115531/ขอขอบคุณสำหรับความคิดเห็นของคุณ
avb

2
คุณไม่ต้องการคอมไพล์สองบรรทัดนี้ 'com.android.support:support-v4:22.2.0' คอมไพล์ 'com.android.support:appcompat-v7:22.2.0', เพราะคอมไพล์ 'com.android.support: การออกแบบ: 22.2.0 'ขึ้นอยู่กับพวกเขา
Andrey

8
โปรดทราบว่านี่ใช้ได้เฉพาะกับอมยิ้มและสูงกว่าเท่านั้น มันจะไม่ทำงานก่อนอมยิ้มเพราะมันใช้แค่ ViewCompat.setElevation ()
Amirul Zin

25

คุณไม่สามารถใช้คุณสมบัติการยกระดับก่อน API 21 (Android Lollipop) อย่างไรก็ตามคุณสามารถเพิ่มเงาโดยทางโปรแกรมได้ตัวอย่างเช่นการใช้มุมมองที่กำหนดเองที่วางไว้ใต้แถบเครื่องมือ

@ รูปแบบ / แถบเครื่องมือ

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

<View
    android:id="@+id/toolbar_shadow"
    android:layout_width="match_parent"
    android:layout_height="3dp"
    android:background="@drawable/toolbar_dropshadow" />

@ drawable / toolbar_dropshadow

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient
        android:startColor="@android:color/transparent"
        android:endColor="#88333333"
        android:angle="90"/> </shape>

ในรูปแบบกิจกรรมของคุณ <include layout="@layout/toolbar" />

ป้อนคำอธิบายรูปภาพที่นี่


2
คุณสามารถแก้ไข@layout/toolbarตัวอย่างด้วยไฟล์แบบเต็มได้หรือไม่
Daniel Gomez Rico

1
เหตุใด @ เลย์เอาต์ / แถบเครื่องมือจึงมีสองมุมมองรูต คุณช่วยยกตัวอย่างให้เต็มได้ไหม?
RED_

18

ใช้/ ค่าโฟลเดอร์เพื่อใช้สไตล์เงาที่ถูกต้องตามเวอร์ชันของระบบปฏิบัติการ

สำหรับอุปกรณ์ 5.0 ที่ต่ำกว่าให้ใช้/values/styles.xmlเพื่อเพิ่มwindowContentOverlayให้กับเนื้อหาของกิจกรรมของคุณ:

<style name="MyViewArea">
    <item name="android:foreground">?android:windowContentOverlay</item>
</style>

<style name="MyToolbar">
    <item name="android:background">?attr/colorPrimary</item>
</style>

จากนั้นเพิ่มเงาที่กำหนดเองของคุณเองโดยเปลี่ยนธีมของคุณเป็น:

<item name="android:windowContentOverlay">@drawable/bottom_shadow</item>

คุณสามารถคว้าทรัพยากรเงาของแอป IO ของ Google ได้ที่นี่: https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png

สำหรับอุปกรณ์ 5.0 & ใหม่กว่าใช้/values-v21/styles.xmlเพื่อเพิ่มระดับความสูงให้กับแถบเครื่องมือของคุณโดยใช้สไตล์ส่วนหัวที่กำหนดเอง:

<style name="MyViewArea">
</style>

<style name="MyToolbar">
    <item name="android:background">?attr/colorPrimary</item>
    <item name="android:elevation">4dp</item>
</style>

โปรดทราบว่าในกรณีที่สองฉันต้องสร้างสไตล์MyViewArea ที่ว่างเปล่าดังนั้นwindowContentOverlayจะไม่ปรากฏขึ้นเช่นกัน

[อัปเดต: เปลี่ยนชื่อทรัพยากรและเพิ่ม Google shadow]


ฉันขอทราบได้ไหมว่า MyBody และ MyHeader คืออะไร ฉันควรสมัครที่ใด
Cheok Yan Cheng

ฉันอัพเดตชื่อ: MyHeader ตอนนี้ MyToolbar และ MyBody คือ MyViewArea คุณสามารถกำหนดสไตล์ในเลย์เอาต์ xml ดังนี้: style = "@ style / MyToolbar"
radley

MyViewArea นำไปใช้กับอะไร?
Zach Sperske

พื้นที่หน้า / ร่างกาย / มุมมองของคุณ
radley

ฉันคิดว่าandroid:foregroundใช้งานได้เฉพาะใน FrameLayout ก่อน API 23
androidguy

14

สิ่งนี้ทำงานได้ดีสำหรับฉัน:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primary"
    card_view:cardElevation="4dp"
    card_view:cardCornerRadius="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primary"
        android:minHeight="?attr/actionBarSize" />

</android.support.v7.widget.CardView>

วิธีนี้สามารถใช้งานได้หากใช้แผ่นมุมมอง pre lollipop เพื่อดึงเงา นี่คือสิ่งที่ฉันได้รับ: i.imgur.com/BIj8env.pngคำตอบนี้ใช้ได้สำหรับฉันและมันก็ไม่ได้รับผลกระทบจากข้อเสียนี้: stackoverflow.com/questions/26575197/
Aspiring Dev

2
ที่จริงแล้วคุณดีกว่าด้วย AppBarLayout ในคำตอบนี้stackoverflow.com/a/31026359/1451716คำตอบของฉันเก่าก่อนที่ AppBarLayout วางจำหน่าย
Islam A. Hassan

มันถูกกฎหมายหรือไม่ ไม่ควรใช้กับ Toolbar พระเจ้าช่วย!
user155

12

หากคุณกำลังตั้งค่าToolBarเป็นActionBarแล้วเพียงแค่โทร:

getSupportActionBar().setElevation(YOUR_ELEVATION);

หมายเหตุ: ต้องเรียกหลังจากนี้ setSupportActionBar(toolbar);


1
มันเป็นแค่ฉันหรือลิ้นชักการนำทางจะรีเซ็ตระดับความสูงของแถบเครื่องมือหรือไม่ ฉันพยายามตั้งค่าเป็น 0 และใช้งานได้ แต่เมื่อฉันลากลิ้นชักการนำทางฉันเห็นเงาอีกครั้ง ...
นักพัฒนา Android

6
setElevation()มีการกำหนดไว้สำหรับ API-21 + เท่านั้น
Subin Sebastian

@Sebastian การยกระดับการดำเนินการสนับสนุนสำหรับ API ก่อนหน้านี้เช่นกัน
Roberto B.

2
ภายในที่ใช้ViewCompat.setElevation()และทำให้ใช้งานได้กับ API 21 ขึ้นไปเท่านั้น
botteaap

ใช้ android: windowContentOverlay หรือ android: เบื้องหน้าสำหรับภายใต้ API 21.
radley


7

ปัญหาของฉันคือแถบเครื่องมือไม่ได้สร้างเงาใด ๆ หากฉันไม่ได้ตั้งค่าแอตทริบิวต์ "ระดับความสูง" นั่นเป็นพฤติกรรมปกติหรือฉันกำลังทำอะไรผิดหรือเปล่า?

นั่นเป็นพฤติกรรมปกติ ดูคำถามที่พบบ่อยในตอนท้ายของโพสต์นี้


7

เล่นกับสิ่งนี้เป็นเวลาหลายชั่วโมงนี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน

ลบelevationแอตทริบิวต์ทั้งหมดออกจากappBarLayoutและToolbarวิดเจ็ต (รวมถึงstyles.xmlหากคุณใช้การใส่สไตล์ใด ๆ )

ตอนนี้อยู่ในกิจกรรมใช้elvationกับactionBar:

Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setElevation(3.0f);

สิ่งนี้น่าจะใช้ได้


ถ้าฉันต้องการระดับความสูงของ AppBarLayout ก็สามารถยุบ / ขยายได้
นักพัฒนา android

1
setElevationรับพารามิเตอร์เป็นพิกเซล คุณต้องแปลงมันอย่างเหมาะสมเช่น(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
Ely

4

RelativeLayoutนอกจากนี้คุณยังสามารถทำให้มันทำงานร่วมกับ สิ่งนี้ช่วยลดการวางเลย์เอาท์เล็กน้อย;)

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar" />

    <View
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:layout_below="@id/toolbar"
        android:background="@drawable/toolbar_shadow" />
</RelativeLayout>

3

สิ่งที่คุณต้องมีandroid:margin_bottomค่าเท่ากับandroid:elevationค่า ไม่มีAppBarLayout,clipToPaddingฯลฯ ที่จำเป็น

ตัวอย่าง:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_marginBottom="4dp"
    android:background="@android:color/white"
    android:elevation="4dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!--Inner layout goes here-->

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.appcompat.widget.Toolbar>

ไม่มีอะไรทำงานยกเว้นสิ่งนี้ตรงประเด็นและเข้าท่าเช่นกัน
DJphy

1

สำหรับ 5.0 +: คุณสามารถใช้ AppBarLayout กับ Toolbar AppBarLayout มี "การยกระดับ" attribure

 <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:elevation="4dp"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <include layout="@layout/toolbar" />
    </android.support.design.widget.AppBarLayout>

แล้วรุ่นก่อนหน้าล่ะ?
นักพัฒนา android

1

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>

ชื่อ = "displayOptions"> useLogo | showHome | showTitle | showCustom

เพิ่มไปยัง Basetheme

<style name="BaseTheme" parent="Theme.AppCompat.Light">
   <item name="android:homeAsUpIndicator">@drawable/home_back</item>
   <item name="actionBarStyle">@style/Theme.ActionBar</item>
</style>

1

โซลูชันส่วนใหญ่ทำงานได้ดีที่นี่ ต้องการแสดงอีกทางเลือกอื่นที่คล้ายกัน:

gradle:

implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
implementation 'com.google.android.material:material:1.0.0-rc02'
implementation 'androidx.core:core-ktx:1.0.0-rc02'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

เลย์เอาต์ของคุณสามารถมีมุมมองของ Toolbar และเงาด้านล่างคล้ายกับสิ่งนี้ (ต้องแก้ไขแน่นอน):

<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="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:titleTextAppearance="@style/Base.TextAppearance.Widget.AppCompat.Toolbar.Title"/>

    <include
        layout="@layout/toolbar_action_bar_shadow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

ความละเอียด / drawable-V21 / toolbar_action_bar_shadow.xml

<androidx.appcompat.widget.AppCompatImageView
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content" android:src="@drawable/msl__action_bar_shadow"/>

ความละเอียด / drawable / toolbar_action_bar_shadow.xml

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:foreground="?android:windowContentOverlay" tools:ignore="UnusedAttribute"/>

ความละเอียด / drawable / msl__action_bar_shadow.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape
            android:dither="true"
            android:shape="rectangle" >
            <gradient
                android:angle="270"
                android:endColor="#00000000"
                android:startColor="#33000000" />

            <size android:height="10dp" />
        </shape>
    </item>

</layer-list>

styles.xml

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar as Toolbar)
    }
}

ตัวอย่างเต็มรูปแบบที่นี่ตามที่ฉันสังเกตเห็นว่า IDE มีข้อผิดพลาดในการพูดforegroundคุณลักษณะที่ใหม่เกินไปที่จะใช้ที่นี่


0

ฉันมีปัญหาคล้ายกันกับเงา เงาถูกวาดโดยพาเรนต์โดยตรงของ AppBarLayout ในกรณีของฉัน หากความสูงของพาเรนต์เหมือนกับของ AppBarLayout เงาจะไม่สามารถวาดได้ ดังนั้นการตรวจสอบขนาดของเลย์เอาต์หลักและการสร้างเลย์เอาต์ใหม่อาจช่วยแก้ปัญหาได้ https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/


0

คำตอบที่ถูกต้องคือการเพิ่ม
android: backgroundTint = "# ff00ff" ลงในแถบเครื่องมือด้วย android: background = "@ android: color / white"

ถ้าคุณใช้สีอื่นแล้วสีขาวสำหรับพื้นหลังมันจะลบเงา เป็นหนึ่งใน Google!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.