Wie wird der Schatten der ActionBar & Toolbar der Support-Bibliothek auf allen Android-Versionen angezeigt?

Dies ist eine einfache Frage:

Ich verwende die neue Unterstützungsbibliothek, mit der ich eine Toolbar-Instanz haben und sie sogar als Aktionsleiste der Aktivität festlegen kann (oder die Standardbibliothek verwenden kann).

Wie kann ich den Schatten anpassen, der von der Symbolleiste (oder der Standard-Aktionsleiste) geworfen wird?

Ich habe versucht, "setElevation" (für beide) zu verwenden, aber auf Android Lollipop schien es nichts zu bewirken.

Auch ich kann nicht finden, wie ich den Schatten auf Pre-Lollipop-Versionen anpassen kann. Gibt es vielleicht eine API dafür? oder zumindest eine ziehbare (habe ich nicht gefunden, obwohl ich es versucht habe)?

OK, ich habe es geschafft, die nächsten Dinge zu finden:

Bei Lollipop und Pre-Lollipop sollte der Schatten gut aussehen, wenn in Ihrer Aktivität die normalen AppCompat-Designs verwendet werden (z. B. "Theme.AppCompat.Light").

Wenn Sie jedoch "setSupportActionBar" verwenden (und ein geeignetes Thema verwenden, z. B. "Theme.AppCompat.Light.NoActionBar"), treten Probleme mit dem Schatten auf.

Für Pre-Lollipop können Sie ein FrameLayout unterhalb der Symbolleiste platzieren, das genau so aussieht wie dasjenige, das für die normalen Themen verwendet wird.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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="wrap_content"
        android:minHeight="?attr/actionBarSize"
        app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar"
        android:foreground="?android:windowContentOverlay"
        android:visibility="@integer/action_bar_shadow_background_visibility" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar"
        android:text="@string/hello_world" />

</RelativeLayout>

Sie können das FrameLayout als Inhalt der Aktivität verwenden oder das verwenden, was ich getan habe. Sie können die Sichtbarkeit auch festlegen, indem Sie die Ganzzahl 0 für Pre-Lollipop und 2 für Lollipop und höher setzen, wie ich es mit "action_bar_shadow_background_visibility" getan habe.

Es ist eine hässliche Lösung, aber es funktioniert, aber nur für Versionen vor Lollipop.

Auf jeden Fall konnte ich immer noch keinen Weg finden, den Schatten für Lollipop gut darzustellen, falls ich "setSupportActionBar" verwende. Ich habe versucht, "setElevation" in der Symbolleiste und in der Aktionsleiste zu verwenden (mit "getSupportActionBar" direkt nach dem Aufruf von "setSupportActionBar").

Ich verstehe auch nicht, wie ich die Standardhöhe der Aktionsleiste ermitteln kann, da mir aufgefallen ist, dass in vielen Lernprogrammen die Verwendung von "minHeight" für die Symbolleiste empfohlen wird. Würde mich auch über Hilfe freuen.

ann mir jemand dabei helfe

Again, um es klar zu machen, das ist, was ich frage:

Zeigen Sie für Pre-Lollipop denselben Schatten an, der in der Support-Bibliothek für Toolbar und ActionBar verwendet wird.Same for Lollipop (aber verwenden Sie die, die Lollipop hat)Extra: Passen Sie den Schatten so an, dass er auf Lollipop "empfindlicher" ist (und passen Sie ihn möglicherweise auf allen Versionen an).Extra: Warum erhält die minHeight der Symbolleiste anstelle der eigentlichen Höhe einen Wert für die Höhe der Aktionsleiste?

EDIT: OK, dies ist soweit ich getan habe, um den Schatten von Lollipop nachzuahmen:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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="wrap_content"
        android:minHeight="?attr/actionBarSize"
        app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

    <include
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar"
        layout="@layout/toolbar_action_bar_shadow" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar"
        android:text="@string/hello_world" />

</RelativeLayout>

res / layout / toolbar_action_bar_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?android:windowContentOverlay" />

res / layout-v21 / toolbar_action_bar_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView 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 / drawable-v21 / res / layout / msl__action_bar_shadow.xml

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

    <!-- intended for lollipop and above -->

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

Es ist nicht genau das gleiche, aber es ist ähnlich.

EDIT: Ich weiß immer noch nicht, warum es passiert. Ich denke, der Code, den ich zu dieser Frage geschrieben habe, ist irreführend, denn alles, was zu tun ist, ist, einen Hintergrund festzulegen. Aber auf der App, die ich teste, hilft es immer noch nicht. Bei der App, die ich reparieren möchte, befindet sich die Symbolleiste über der Navigationsleiste.

Für einen Moment dachte ich, dass es daran liegen könnte, dass ich eine benutzerdefinierte Symbolleiste erstellt habe (die sich von der Symbolleiste aus erstreckt) und deren Alpha-Wert ändert (entsprechend der Navigationsleiste), aber selbst wenn ich die normale Symbolleiste verwende und alles deaktiviere, was ist Im Zusammenhang mit Alpha funktioniert es immer noch nicht. Außerdem habe ich in einem völlig neuen Projekt versucht, einen halbtransparenten Hintergrund für die Symbolleiste festzulegen, und dieser hat nach der Methode "setElevation" einen Schatten erhalten.

Jetzt ist es noch schwieriger für mich, die Ursache für dieses Problem zu finden, da es anscheinend nicht an der Transparenz und nicht an einer benutzerdefinierten Toolbar-Klasse liegt ...

Hier ist das Layout der Aktivität mit der Symbolleiste, falls dies in irgendeiner Weise hilfreich sein kann:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/activity_main__drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

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

        <include
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:layout_marginTop="?attr/actionBarSize"
            layout="@layout/activity_main__sliding_menu" />
    </android.support.v4.widget.DrawerLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <com.app.ui.Toolbar
            android:id="@+id/activity_main__toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:layoutDirection="ltr"
            android:minHeight="?attr/actionBarSize"
            app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
            tools:ignore="UnusedAttribute" />

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

</FrameLayout>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage