Araç Çubuğunda varsayılan olarak gölge yok mu?


165

Uygulamamı, v21 destek kitaplığındaki yeni Araç Çubuğu ile güncelliyoruz. Benim sorunum, "yükseklik" özniteliğini ayarlamazsanız, araç çubuğunun herhangi bir gölge almamasıdır. Bu normal davranış mı yoksa yanlış bir şey mi yapıyorum?

Kodum:

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

Ve benim faaliyetimde - OnCreate yöntemi:

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

Bunu Lollipop çalıştıran bir cihazda görüyor musunuz?
rlay3

3
Lollipop çalıştıran bir cihazda, yükselti özelliği nedeniyle gölgeyi gösterir ancak KitKat veya daha eski sürümlerde gösterilmez. Belgelerin söylediği gibi yükseklik özelliğinin beklenen davranışı budur, ancak varsayılan olarak yükseklik özelliği olmadan gölgenin her sürümde Eylem Çubuğu yaptığı gibi yayınlanacağını bekliyordum.
MrBrightside

Burada olası bir çözüm gönderdim: stackoverflow.com/a/26759202/553905
Billy

İşletim sistemi sürümüne göre uygun gölge kodunu uygulamak için / değerleri klasörleri ve styles.xml kullanın (aşağıya bakın).
radley

Yanıtlar:


252

Araç çubuğu için kendi alt gölgemi ayarladım, onu arayan herkes için yararlı olabileceğini düşündüm:

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

@ Çekilebilir / 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>

@ Renkli / color_alizarin

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

resim açıklamasını buraya girin


3
Çalıştırdığınız cihaz Lollipop'a> = ise, görünümünüzü gizlemeyi unutmayın, aksi takdirde iki gölge elde edersiniz.
mradzinski

1
Bunun yanlış yolu budur çünkü 5.0 görünümü için bu görünümü kaldırmanız gerekir. Bunun yerine android: windowContentOverlay veya android: ön plan kullanın.
radley

3
Google'dan Araç Çubuğu malzeme tasarımını tasarlama konusunda android:layout_height="4dp", bunun yerine gölgenin yüksekliğini ayarlamanız gerekir 5dp. Aslında, yükseklik ayarladığınız gölgenin yüksekliği ile aynıdır FrameLayout.
Anggrayudi H

2
Bu çözümle ilgili sorun yaşıyorum çünkü etkinlik düzenimi örneğinizdeki çerçeve düzenine şişiriyorum, bunun çalışması için bir yol düşünebilir misiniz?
Zach Sperske

2
Android üzerinden "android: endColor =" # c7c7c7 "kullanılması önerilir: endColor =" # 88333333 "
Mohammad Faisal

211

Google, birkaç hafta önce Tasarım Destek kitaplığını yayınladı ve bu kitaplıkta bu soruna şık bir çözüm var.

Tasarım Desteği kitaplığını aşağıdakilere bağımlı olarak ekleyin build.gradle:

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

Ekle AppBarLayoutsenin etrafında sarıcı olarak kütüphaneye tarafından sağlanan Toolbardüzeni bir gölge oluşturmak için.

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

İşte sonuç:

resim açıklamasını buraya girin

Tasarım destek kütüphanesi ile ilgili birçok başka ipucu var.

  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

Yukarıdaki gibi ama bağımlı olan:

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

ve com.google.android.material.appbar.AppBarLayout


26
Ayar AppBarLayoutetrafında sarıcı olarak Toolbarbenim için hiçbir gölge belirlemez. Gezinme çekmecesi kullanmadığımı unutmayın. Neden işe yaramadığına dair bir fikrin var mı?
avb

@ avb1994 Kesinlikle söyleyemem, bir çekmece olmadan test ettim. Düzen dosyasıyla soru olarak gönderebilir misiniz?
Binoy Babu

soruma bakın: stackoverflow.com/questions/31115531/… yorumunuz için teşekkürler
avb

2
'Com.android.support:support-v4:22.2.0' derlemek 'com.android.support:appcompat-v7:22.2.0' derlemek için bu iki satıra ihtiyacınız yoktur, çünkü 'com.android.support derleyin: tasarım: 22.2.0 'onlara bağlı
Andrey

8
Bunun sadece lolipop ve üstü için çalıştığını unutmayın. Altında sadece ViewCompat.setElevation () kullandığından lolipop öncesi çalışmayacaktır.
Amirul Zin

25

API 21'den (Android Lollipop) önce yükseklik özelliğini kullanamazsınız. Ancak gölgeyi programlı olarak ekleyebilirsiniz, örneğin Araç Çubuğunun altına yerleştirilmiş özel bir görünüm kullanarak.

@ Düzen / araç çubuğu

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

@ Çekilebilir / 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>

etkinlik düzeninizde <include layout="@layout/toolbar" />

resim açıklamasını buraya girin


2
@layout/toolbarTam düzen dosyasıyla örneği düzeltebilir misiniz ?
Daniel Gomez Rico

1
@ Düzen / araç çubuğunun neden iki kök görünümü var? Lütfen tam örneği verebilir misiniz?
RED_

18

Kullanım / değerlerOS sürümüne göre doğru gölge stilini uygulamak için klasörlerini .

5.0'ın altındaki cihazlarda , faaliyetinizin gövdesine windowContentOverlay öğesini eklemek için /values/styles.xml dosyasını kullanın:

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

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

Ardından Temanızı aşağıdakileri içerecek şekilde değiştirerek kendi özel gölgenizi ekleyin:

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

Google'ın IO uygulaması gölge kaynağını buradan alabilirsiniz: https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png

5.0 ve sonraki sürümler için , özel bir başlık stili kullanarak araç çubuğunuza yükseklik eklemek için /values-v21/styles.xml dosyasını kullanın :

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

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

İkinci durumda, windowContentOverlay için boş bir MyViewArea stili oluşturmak zorunda olduğumu unutmayın .

[Güncelleme: kaynak adlarını değiştirdi ve Google gölgesi ekledi.]


MyBody ve MyHeader'ın ne olduğunu öğrenebilir miyim? Onları nereye uygulamalıyım?
Cheok Yan Cheng

İsimleri güncelledim: MyHeader artık MyToolbar ve MyBody MyViewArea. Xml mizanpajlarına şu şekilde stiller atayabilirsiniz: style = "@ style / MyToolbar".
radley

MyViewArea ne uygulanır?
Zach Sperske

Sayfanız / gövde / görünüm alanınız.
radley

Bence android:foregroundAPI 23'den önce sadece FrameLayout üzerinde çalışıyor
androidguy

14

Bu benim için çok iyi çalıştı:

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

Lolipop öncesi cardview'de gölge çizmek için kendini doldurursa bu nasıl çalışır? Aldığım şey bu : i.imgur.com/BIj8env.png Bu cevap benim için çalıştı ve bunun dezavantajları yok: stackoverflow.com/questions/26575197/…
Aspiring Dev

2
Aslında, bu cevaptaki gibi AppBarLayout ile daha iyi durumdasınız stackoverflow.com/a/31026359/1451716 Cevabım, AppBarLayout yayınlanmadan önce eski
Islam A. Hassan

Bu yasal mı? Araç Çubuğu ile kullanılması gerekmez. AMAN TANRIM!
user155

12

ToolBarAs ayarını yapıyorsanız, ActionBarsadece şunu arayın:

getSupportActionBar().setElevation(YOUR_ELEVATION);

Not: Bu kod, setSupportActionBar(toolbar);


1
Sadece ben miyim yoksa gezinme çekmecesi araç çubuğunun yüksekliğini sıfırlıyor mu? 0'a ayarlamaya çalıştım ve işe yaradı, ama sonra navigasyon çekmecesini sürüklediğimde, yine bir gölgeye sahip olduğunu görüyorum ...
android geliştirici

6
setElevation()olsa da yalnızca API-21 + için tanımlanmıştır.
Subin Sebastian

@Sebastian Destek eylem çubuğu yükseltmesi önceki API'ler için de çalışır.
Roberto B.

2
Dahili olarak bu ViewCompat.setElevation()sadece API 21 ve üstü üzerinde çalışır ve böylece çalışır.
botteaap

Android kullanın: windowContentOverlay veya android: API 21 altında ön plan
radley

9

ekledim

<android.support.v7.widget.Toolbar
...
android:translationZ="5dp"/>

araç çubuğu açıklamasında ve benim için çalışıyor. 5.0+ kullanma


7

Benim sorunum, "yükseklik" özniteliğini ayarlamazsanız, araç çubuğunun herhangi bir gölge almamasıdır. Bu normal davranış mı yoksa yanlış bir şey mi yapıyorum?

Normal davranış budur. Ayrıca bu yazının sonundaki SSS bölümüne bakın .


7

Saatlerce bununla oynuyordum, işte benim için işe yarayan.

Ve widget'lardaki tüm elevationnitelikleri kaldırın ( herhangi bir stil uyguluyorsanız dahil ).appBarLayoutToolbarstyles.xml

Şimdi aktivite içinde geçerlidir elvationsizinle ilgili şu actionBar:

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

Bu çalışmalı.


Daraltma / genişletme gibi AppBarLayout üzerinde yükseklik istiyorum?
android geliştirici

1
setElevationbir parametreyi piksel olarak alır. Uygun bir şekilde dönüştürmeniz gerekir, örneğin(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
Ely

4

Ayrıca çalışmasını da sağlayabilirsiniz RelativeLayout. Bu düzen yerleştirmeyi biraz azaltır;)

<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

İhtiyacınız olan tek şey değere android:margin_bottomeşit android:elevation. Hayır AppBarLayout, clipToPaddingvb. Gereklidir.

Misal:

<?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>

Bunun dışında hiçbir şey işe
yaramıyor

1

5.0 + için: Araç Çubuğu ile AppBarLayout'u kullanabilirsiniz. AppBarLayout "yükseklik" özelliğine sahiptir.

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

Önceki sürümler ne olacak?
android geliştirici

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 arka planına ekle

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

isim = "displayoptions"> useLogo | showHome | showTitle | showCustom

Basetheme'e ekle

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

1

Çoğu çözüm burada iyi çalışıyor. Başka, benzer bir alternatif göstermek ister misiniz:

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'

Düzeninizde buna benzer bir Araç Çubuğu Görünümü ve bunun için bir gölge olabilir (elbette değiştirilmesi gerekir):

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

res / çekilebilir-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"/>

res / çekilebilir / 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"/>

res / çekilebilir / 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)
    }
}

Tam örnek burada , IDE fark buradaforeground özelliği kullanmak için çok yeni olduğunu söyleyerek bir hata var fark ettim .



0

Doğru cevap
android ile araç çubuğuna android: backgroundTint = "# ff00ff" eklemek olacaktır : background = "@ android: renk / beyaz"

Arka plan için beyazdan sonra başka bir renk kullanırsanız, gölge kaldırılır. İyi Google!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.