Saya memperbarui aplikasi saya dengan Toolbar baru dari perpustakaan dukungan v21. Masalah saya adalah bahwa bilah alat tidak menampilkan bayangan apa pun jika saya tidak menetapkan atribut "elevasi". Apakah itu perilaku normal atau saya melakukan sesuatu yang salah?
Kode saya adalah:
<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">
.
.
.
Dan dalam Aktivitas saya - Metode OnCreate:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
android
android-5.0-lollipop
material-design
android-toolbar
MrBrightside
sumber
sumber
Jawaban:
Saya akhirnya menetapkan drop shadow saya sendiri untuk bilah alat, berpikir mungkin bermanfaat bagi siapa pun yang mencarinya:
@ drawable / toolbar_dropshadow:
@ color / color_alizarin
sumber
android:layout_height="4dp"
ketinggian bayangan, alih-alih5dp
. Sebenarnya, ketinggian sama dengan ketinggian bayangan yang Anda aturFrameLayout
.Google merilis perpustakaan Dukungan Desain beberapa minggu yang lalu dan ada solusi bagus untuk masalah ini di perpustakaan ini.
Tambahkan pustaka Dukungan Desain sebagai ketergantungan di
build.gradle
:Tambahkan yang
AppBarLayout
disediakan oleh perpustakaan sebagai pembungkus di sekitarToolbar
tata letak Anda untuk menghasilkan drop shadow.Inilah hasilnya:
Ada banyak trik lain dengan perpustakaan dukungan desain.
AndroidX
Seperti di atas tetapi dengan ketergantungan:
dan
com.google.android.material.appbar.AppBarLayout
sumber
AppBarLayout
sebagai pembungkus di sekitarToolbar
tidak mengatur bayangan untuk saya. Perhatikan bahwa saya tidak menggunakan laci navigasi. Ada ide mengapa itu tidak berhasil?Anda tidak dapat menggunakan atribut elevasi sebelum API 21 (Android Lollipop). Namun Anda dapat menambahkan bayangan secara pemrograman, misalnya menggunakan tampilan khusus yang ditempatkan di bawah Bilah Alat.
@ tata letak / bilah alat
@ drawable / toolbar_dropshadow
dalam tata letak aktivitas Anda
<include layout="@layout/toolbar" />
sumber
@layout/toolbar
contoh dengan file layout penuh?Gunakan / nilai folder untuk menerapkan gaya bayangan yang benar berdasarkan versi OS.
Untuk perangkat di bawah 5.0 , gunakan /values/styles.xml untuk menambahkan windowContentOverlay ke tubuh aktivitas Anda:
Kemudian tambahkan bayangan kustom Anda sendiri dengan mengubah Tema Anda untuk memasukkan:
Anda dapat mengambil sumber bayangan aplikasi Google IO di sini: https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png
Untuk 5.0 perangkat & yang lebih baru , gunakan /values-v21/styles.xml untuk menambahkan elevasi ke toolbar Anda menggunakan gaya header khusus:
Perhatikan bahwa dalam kasus kedua, saya harus membuat gaya MyViewArea kosong sehingga windowContentOverlay tidak akan muncul juga.
[Perbarui: mengubah nama sumber daya dan menambahkan Google shadow.]
sumber
android:foreground
hanya bekerja di FrameLayout sebelum API 23.Ini bekerja dengan baik untuk saya:
sumber
Jika Anda seting yang
ToolBar
sebagaiActionBar
kemudian hanya menyebut:Catatan: Ini harus dipanggil setelah
setSupportActionBar(toolbar);
sumber
setElevation()
didefinisikan hanya untuk API-21 +.ViewCompat.setElevation()
dan hanya akan bekerja pada API 21 dan lebih tinggi.saya tambahkan
dalam deskripsi bilah alat dan berfungsi untuk saya. Menggunakan 5.0+
sumber
Itu perilaku normal. Lihat juga FAQ di akhir posting ini .
sumber
Bermain-main dengan ini selama berjam-jam, inilah yang bekerja untuk saya.
Hapus semua
elevation
atribut dari widgetappBarLayout
danToolbar
(termasukstyles.xml
jika Anda menerapkan gaya apa pun).Sekarang di dalam aktivitas, terapkan
elvation
padaactionBar
:Ini seharusnya bekerja.
sumber
setElevation
mengambil parameter sebagai piksel. Anda harus mengonversinya dengan tepat, misalnya(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
Anda juga bisa membuatnya bekerja
RelativeLayout
. Ini sedikit mengurangi tata letak bersarang;)sumber
Yang Anda butuhkan adalah
android:margin_bottom
sama denganandroid:elevation
nilainya. TidakAppBarLayout
,,clipToPadding
dll. Diperlukan.Contoh:
sumber
Untuk 5.0 +: Anda dapat menggunakan AppBarLayout dengan Bilah Alat. AppBarLayout memiliki atribut "elevasi".
sumber
actionbar_background.xml
tambahkan ke latar belakang actionbar_style
name = "displayOptions"> useLogo | showHome | showTitle | showCustom
tambahkan ke Basetheme
sumber
Sebagian besar solusi berfungsi dengan baik di sini. Ingin menampilkan alternatif lain yang serupa:
gradle:
Tata letak Anda dapat memiliki Tampilan Bilah Alat, dan bayangan untuk itu, di bawah, mirip dengan ini (perlu modifikasi tentu saja):
res / drawable-v21 / toolbar_action_bar_shadow.xml
res / drawable / toolbar_action_bar_shadow.xml
res / drawable / msl__action_bar_shadow.xml
styles.xml
MainActivity.kt
Contoh lengkap di sini , karena saya perhatikan bahwa IDE memiliki bug untuk mengatakan
foreground
atribut terlalu baru untuk digunakan di sini.sumber
Saya memiliki masalah yang sama dengan bayangan. Bayangan ditarik oleh induk langsung dari AppBarLayout dalam kasus saya. Jika tinggi induknya sama dengan AppBarLayout, bayangannya tidak bisa digambar. Jadi memeriksa ukuran tata letak induk dan mungkin tata letak pembuatan ulang dapat menyelesaikan masalah. https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/
sumber
Jawaban yang benar adalah menambahkan
android: backgroundTint = "# ff00ff" ke bilah alat dengan android: background = "@ android: color / white"
Jika Anda menggunakan warna lain maka putih untuk latar belakang itu akan menghapus bayangan. Bagus sekali Google!
sumber