Entfernen Sie Schatten unter AppBarLayout Widget Android

94

Bei Verwendung des AppBarLayoutWidgets in der Designunterstützungsbibliothek wird unten in der Symbolleiste ein Schatten angezeigt. Wie kann ich diesen Schatten entfernen?

Abdul Rehman
quelle

Antworten:

231

Verwenden Sie einfach app:elevation="0dp""AppBarLayout", um den Schatten zu entfernen. Es hat immer für mich funktioniert. Hoffe es funktioniert für dich.

danialzahid94
quelle
61
Verwenden Sie nicht Android: Elevation. Verwenden Sie App: Höhe.
Radley
3
Gibt es eine Möglichkeit, dies programmgesteuert durchzuführen, ohne die Warnung zu erhalten, dass die Einstellung der Höhe erst nach L verfügbar ist?
Davidcv5
2
App: Elevation = "0dp", Schatten wird entfernt, aber jetzt können Registerkarten nicht mehr angeklickt werden.
Sandeep P
8
Wenn Sie den Wert auf 0dp setzen, wird die Symbolleiste ausgeblendet.
Shajeel Afzal
1
Leider keine funktionierende Antwort mehr. Siehe Liu Teng Antwort unten mitsetOutlineProvider
Matthew
49

Dieses Problem tritt nur auf, wenn die API-Version> = 21 ist. Wenn Sie die Höhe nicht ändern möchten, können Sie Folgendes verwenden:

appBar.setOutlineProvider(null);

Denken Sie daran, die API-Version zu überprüfen


EDIT:

Schlag ist der Quellcode von setOutlineProvider.

   /**
     * Sets the {@link ViewOutlineProvider} of the view, which generates the Outline that defines
     * the shape of the shadow it casts, and enables outline clipping.
     * <p>
     * The default ViewOutlineProvider, {@link ViewOutlineProvider#BACKGROUND}, queries the Outline
     * from the View's background drawable, via {@link Drawable#getOutline(Outline)}. Changing the
     * outline provider with this method allows this behavior to be overridden.
     * <p>
     * If the ViewOutlineProvider is null, if querying it for an outline returns false,
     * or if the produced Outline is {@link Outline#isEmpty()}, shadows will not be cast.
     * <p>
     * Only outlines that return true from {@link Outline#canClip()} may be used for clipping.
     *
     * @see #setClipToOutline(boolean)
     * @see #getClipToOutline()
     * @see #getOutlineProvider()
     */
    public void setOutlineProvider(ViewOutlineProvider provider) {
        mOutlineProvider = provider;
        invalidateOutline();
    }

Es wurde gesagt, dass If the ViewOutlineProvider is null, if querying it for an outline returns false, or if the produced Outline is {@link Outline#isEmpty()}, shadows will not be cast.

Wenn Sie also Schatten entfernen möchten, sollten Sie diese Methode verwenden, anstatt sie festzulegen app:elevation. Es scheint, dass das Ändern der Höhe zum Entfernen von Schatten eine Art Nebeneffekt ist. In einigen Fällen kann das Ändern der Höhe zu anderen Problemen führen.

Liu Teng
quelle
API ist nur ab Version 21 verfügbar.
Chakrapani
Was tun mit API <21?
DYS
Dieses Problem tritt nur auf, wenn api> = 21
Liu Teng
9

Für alle, die die Symbolleiste nicht verwenden möchten bringToFront()und elevation="0dp"verschwinden lassen:

app:elevation="0dp"kombiniert mit android:translationZ="0.1dp"arbeitete für mich.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="0dp"
    android:translationZ="0.1dp"
    >

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@null"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>

</android.support.design.widget.AppBarLayout>
fupduck
quelle
8

Mit den neuesten Appcompat-Versionen funktioniert die Trickeinstellung app:elevation="0.1dp"in XML nicht mehr.

Bisher habe ich zwei Lösungen gefunden.

  1. app:elevationVersuchen Sie statt der Einstellung einen stateListAnimator zu verwenden. Zum Beispiel im Code:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        StateListAnimator stateListAnimator = new StateListAnimator();
        stateListAnimator.addState(new int[0], ObjectAnimator.ofFloat(appBarLayout, "elevation", 0.1f));
        appBarLayout.setStateListAnimator(stateListAnimator);
    }
  2. Eine einfachere Möglichkeit besteht darin, dass Sie weiterhin app:elevation="0dp"wie gewohnt in XML, jedoch im Code festlegen :

    appBarLayout.bringToFront();

Dank geht an diese beiden Diskussionen:

Die Symbolleiste verschwindet, wenn die Höhe für AppBarLayout festgelegt wird

Wenn App: Elevation = "0dp" eingestellt ist, wird das Hamburgermenü nicht in der Symbolleiste angezeigt

Gaolei
quelle
3

Verwenden Sie android:stateListAnimator="@null". Keine Nebenwirkung.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:stateListAnimator="@null"
    >
Softlion
quelle
2

Ich habe versucht, app:elevation="0dp"aber die Symbolleiste verschwindet, aber mitapp:elevation="0.1dp" hat der Trick gemacht.

Hoffe das hilft jemand anderem.

Gueorgui Obregon
quelle
0.1dp funktioniert auch nicht. Es versteckt auch das Symbolleistenmenü.
Shajeel Afzal
Ich habe eine funktionierende App mit Appcompat v23.0.1, die diese Tipps verwendet. Welche Version haben Sie?
Gueorgui Obregon
Ich benutze v25.0.0.
Shajeel Afzal
2
Es scheint nicht mehr mit aktualisierten Versionen zu funktionieren :(.
Gueorgui Obregon
2

App hinzufügen: height = "0dp" in Ihrem AppBarLayout. wie dieses Beispiel

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>
Faxriddin Abdullayev
quelle
Lebensrettende Antwort :)
user2672052
1

Programmatisch können Sie Folgendes verwenden: getSupportActionBar (). SetElevation (0.0f);

Iam ByeBlogs
quelle
0

Auf diese Weise habe ich app:elevation="0dp"den Schatten entfernt. Funktioniert einwandfrei.

arc_shiva
quelle