Aktualizuję aplikację za pomocą nowego paska narzędzi Toolbar z biblioteki pomocy technicznej w wersji 21. Mój problem polega na tym, że pasek narzędzi nie rzuca żadnego cienia, jeśli nie ustawię atrybutu „wysokość”. Czy to normalne zachowanie, czy robię coś złego?
Mój kod to:
<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">
.
.
.
A w mojej aktywności - metoda OnCreate:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
android
android-5.0-lollipop
material-design
android-toolbar
Pan Brightside
źródło
źródło
Odpowiedzi:
Skończyło się na ustawieniu własnego cienia dla paska narzędzi, pomyślałem, że może to być pomocne dla każdego, kto go szuka:
@ drawable / toolbar_dropshadow:
@ color / color_alizarin
źródło
android:layout_height="4dp"
wysokość cienia zamiast5dp
. W rzeczywistości wysokość jest taka sama, jak wysokość ustawionego cieniaFrameLayout
.Firma Google udostępniła bibliotekę Design Support kilka tygodni temu iw tej bibliotece jest sprytne rozwiązanie tego problemu.
Dodaj bibliotekę Design Support jako zależność w
build.gradle
:Dodaj
AppBarLayout
dostarczone przez bibliotekę jako opakowanie wokółToolbar
układu, aby wygenerować cień.Oto wynik:
Istnieje wiele innych sztuczek związanych z biblioteką wsparcia projektowania.
AndroidX
Jak wyżej, ale z zależnością:
i
com.google.android.material.appbar.AppBarLayout
źródło
AppBarLayout
jako otulinyToolbar
nie stanowi dla mnie żadnego cienia. Pamiętaj, że nie używam szuflady nawigacji. Jakieś pomysły, dlaczego to nie działa?Nie możesz użyć atrybutu Elevation przed API 21 (Android Lollipop). Możesz jednak dodać cień programowo, na przykład używając widoku niestandardowego umieszczonego poniżej paska narzędzi.
@ układ / pasek narzędzi
@ drawable / toolbar_dropshadow
w układzie aktywności
<include layout="@layout/toolbar" />
źródło
@layout/toolbar
przykład z pełnym plikiem układu?Użyj / wartości folderów aby zastosować właściwy styl cienia na podstawie wersji systemu operacyjnego.
W przypadku urządzeń poniżej 5.0 użyj /values/styles.xml, aby dodać windowContentOverlay do treści swojej aktywności:
Następnie dodaj własny niestandardowy cień, zmieniając motyw, aby uwzględnić:
Możesz pobrać zasób cienia aplikacji Google IO tutaj: https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png
W przypadku urządzeń 5.0 i nowszych użyj /values-v21/styles.xml, aby dodać podniesienie do paska narzędzi za pomocą niestandardowego stylu nagłówka:
Zwróć uwagę, że w drugim przypadku musiałem utworzyć pusty MyViewArea styl , aby plik windowContentOverlay się nie .
[Aktualizacja: zmienione nazwy zasobów i dodane Google shadow.]
źródło
android:foreground
działa tylko na FrameLayout przed API 23.To zadziałało dla mnie bardzo dobrze:
źródło
Jeśli ustawiasz
ToolBar
asActionBar
to po prostu zadzwoń:Uwaga: należy to wywołać później
setSupportActionBar(toolbar);
źródło
setElevation()
jest jednak zdefiniowany tylko dla API-21 +.ViewCompat.setElevation()
i dlatego będzie działać tylko na API 21 i nowszych.dodałem
w opisie paska narzędzi i to działa dla mnie. Używam 5.0+
źródło
To normalne zachowanie. Zobacz także FAQ na końcu tego postu .
źródło
Bawiłem się tym godzinami, oto co mi zadziałało.
Usuń wszystkie
elevation
atrybuty z widżetówappBarLayout
iToolbar
(w tymstyles.xml
przypadku stosowania stylów).Teraz aktywność wewnętrzna, zastosuj
elvation
naactionBar
:To powinno działać.
źródło
setElevation
przyjmuje parametr w pikselach. Trzeba to odpowiednio przekonwertować, np.(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
Możesz także sprawić, by to działało
RelativeLayout
. Zmniejsza to trochę zagnieżdżanie układu;)źródło
Wszystko, czego potrzebujesz, to
android:margin_bottom
równaandroid:elevation
wartości. NieAppBarLayout
,clipToPadding
itp. Wymagane.Przykład:
źródło
Wersja 5.0 +: możesz używać AppBarLayout z paskiem narzędzi. AppBarLayout ma atrybut „podniesienie uprawnień”.
źródło
actionbar_background.xml
dodaj do tła actionbar_style
name = "displayOptions"> useLogo | showHome | showTitle | showCustom
dodaj do Basetheme
źródło
Większość rozwiązań działa tutaj dobrze. Chciałbym pokazać inną, podobną alternatywę:
gradle:
Możesz mieć widok paska narzędzi i cień poniżej, podobny do tego (oczywiście wymaga modyfikacji):
res / drawable-v21 / toolbar_action_bar_shadow.xml
res / drawable / toolbar_action_bar_shadow.xml
res / drawable / msl__action_bar_shadow.xml
style.xml
MainActivity.kt
Pełna próbka tutaj , jak zauważyłem, IDE ma błąd polegający na tym, że
foreground
atrybut jest zbyt nowy, aby go tutaj użyć.źródło
Miałem podobny problem z cieniem. W moim przypadku cień jest rysowany przez bezpośredniego rodzica AppBarLayout. Jeśli wysokość elementu nadrzędnego jest taka sama jak w AppBarLayout, nie można narysować cienia. Więc sprawdzenie rozmiaru układu nadrzędnego i być może przeróbka układu może rozwiązać problem. https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/
źródło
Poprawną odpowiedzią będzie dodanie
android: backgroundTint = "# ff00ff" do paska narzędzi za pomocą android: background = "@ android: color / white"
Jeśli użyjesz innego koloru niż biały jako tło, usunie cień. Niezły Google!
źródło