Ich aktualisiere meine App mit der neuen Symbolleiste aus der Support-Bibliothek v21. Mein Problem ist, dass die Symbolleiste keinen Schatten wirft, wenn ich das Attribut "Höhe" nicht festlege. Ist das das normale Verhalten oder mache ich etwas falsch?
Mein Code lautet:
<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">
.
.
.
Und in meiner Aktivität - OnCreate-Methode:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
android
android-5.0-lollipop
material-design
android-toolbar
MrBrightside
quelle
quelle
Antworten:
Am Ende habe ich meinen eigenen Schlagschatten für die Symbolleiste festgelegt und dachte, er könnte für jeden hilfreich sein, der danach sucht:
@ drawable / toolbar_dropshadow:
@ color / color_alizarin
quelle
android:layout_height="4dp"
stattdessen die Höhe des Schattens festlegen5dp
. Tatsächlich entspricht die Höhe der Schattenhöhe, auf die Sie eingestellt habenFrameLayout
.Google hat die Design Support-Bibliothek vor einigen Wochen veröffentlicht. In dieser Bibliothek gibt es eine raffinierte Lösung für dieses Problem.
Fügen Sie die Design Support-Bibliothek als Abhängigkeit hinzu in
build.gradle
:Fügen Sie
AppBarLayout
von der Bibliothek bereitgestelltes Wrapper um IhrToolbar
Layout hinzu, um einen Schlagschatten zu erzeugen.Hier ist das Ergebnis:
Es gibt viele andere Tricks mit der Design-Support-Bibliothek.
AndroidX
Wie oben, jedoch mit Abhängigkeit:
und
com.google.android.material.appbar.AppBarLayout
quelle
AppBarLayout
als Wrapper um dasToolbar
setzt für mich keinen Schatten. Beachten Sie, dass ich keine Navigationsschublade verwende. Irgendwelche Ideen, warum es nicht funktioniert?Sie können das Höhenattribut nicht vor API 21 (Android Lollipop) verwenden. Sie können den Schatten jedoch programmgesteuert hinzufügen, z. B. mithilfe einer benutzerdefinierten Ansicht unterhalb der Symbolleiste.
@ Layout / Symbolleiste
@ drawable / toolbar_dropshadow
in Ihrem Aktivitätslayout
<include layout="@layout/toolbar" />
quelle
@layout/toolbar
Beispiel mit einer vollständigen Layoutdatei reparieren ?Verwenden Sie die Ordner / values , um den richtigen Schattenstil basierend auf der Betriebssystemversion anzuwenden.
Verwenden Sie für Geräte unter 5.0 /values/styles.xml , um windowContentOverlay zum Hauptteil Ihrer Aktivität hinzuzufügen :
Fügen Sie dann Ihren eigenen Schatten hinzu, indem Sie Ihr Thema so ändern, dass es Folgendes enthält:
Sie können die Schattenressource der IO-App von Google hier herunterladen : https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png
Verwenden Sie für Geräte der Version 5.0 und höher /values-v21/styles.xml , um Ihrer Symbolleiste mithilfe eines benutzerdefinierten Kopfzeilenstils eine Höhe hinzuzufügen :
Beachten Sie, dass ich im zweiten Fall einen leeren MyViewArea- Stil erstellen musste, damit windowContentOverlay angezeigt wird nicht wird.
[Update: Ressourcennamen geändert und Google Shadow hinzugefügt.]
quelle
android:foreground
, funktioniert nur auf FrameLayout vor API 23.Das hat bei mir sehr gut funktioniert:
quelle
Wenn Sie das
ToolBar
als einstellen,ActionBar
rufen Sie einfach an:Hinweis: Dies muss nach aufgerufen werden
setSupportActionBar(toolbar);
quelle
setElevation()
ist jedoch nur für API-21 + definiert.ViewCompat.setElevation()
und funktioniert daher nur mit API 21 und höher.Ich fügte hinzu
in der Symbolleistenbeschreibung und es funktioniert für mich. Verwenden von 5.0+
quelle
Das ist das normale Verhalten. Siehe auch die FAQ am Ende dieses Beitrags .
quelle
Ich habe stundenlang damit gespielt, hier ist, was für mich funktioniert hat.
Entfernen Sie alle
elevation
Attribute aus den WidgetsappBarLayout
undToolbar
(auchstyles.xml
wenn Sie ein Styling anwenden).Wenden Sie nun innerhalb der Aktivität Folgendes
elvation
anactionBar
:Das sollte funktionieren.
quelle
setElevation
Nimmt einen Parameter als Pixel. Sie müssen es entsprechend konvertieren, zB(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
Sie können es auch zum Laufen bringen
RelativeLayout
. Dies reduziert die Verschachtelung des Layouts ein wenig;)quelle
Alles was Sie brauchen ist
android:margin_bottom
gleich demandroid:elevation
Wert. NeinAppBarLayout
,clipToPadding
usw. erforderlich.Beispiel:
quelle
Für 5.0 +: Sie können AppBarLayout mit Symbolleiste verwenden. AppBarLayout hat die Zuordnung "Höhe".
quelle
actionbar_background.xml
zum actionbar_style Hintergrund hinzufügen
name = "displayOptions"> useLogo | showHome | showTitle | showCustom
zu Basetheme hinzufügen
quelle
Die meisten Lösungen funktionieren hier einwandfrei. Möchte eine andere, ähnliche Alternative zeigen:
Gradle:
Ihr Layout kann eine Symbolleistenansicht und einen Schatten dafür haben, ähnlich wie dieser (muss natürlich geändert werden):
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
Vollständiges Beispiel hier , da ich festgestellt habe, dass die IDE den Fehler hat, dass das
foreground
Attribut zu neu ist, um hier verwendet zu werden.quelle
Ich hatte ein ähnliches Problem mit dem Schatten. Der Schatten wird in meinem Fall vom direkten übergeordneten Element von AppBarLayout gezeichnet. Wenn die Höhe des übergeordneten Elements mit der von AppBarLayout übereinstimmt, kann der Schatten nicht gezeichnet werden. Das Überprüfen der Größe des übergeordneten Layouts und möglicherweise des Layout-Remakes kann das Problem lösen. https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/
quelle
Die richtige Antwort ist,
android: backgroundTint = "# ff00ff" zur Symbolleiste mit android: background = "@ android: color / white" hinzuzufügen.
Wenn Sie eine andere Farbe als Weiß als Hintergrund verwenden, wird der Schatten entfernt. Netter Google!
quelle