Entfernen Sie den Schatten unter der Aktionsleiste


208

Ich benutze Actionbarsherlock. Der folgende Code ist dafür verantwortlich, den Hintergrund in einen benutzerdefinierten zu ändern.

<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.ActionBar">
    <item name="background">@drawable/actionbar_bg</item>
    <item name="android:background">@drawable/actionbar_bg</item>
    <...>  
</style>

<style name="Theme.MyApp" parent="@style/Theme.Sherlock.Light">
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <..>
</style>

Und es funktioniert für Actionbarsherlock (bei Versionen unter Honeycomb). Aber in ICS habe ich einen Schatten unter der Aktionsleiste, den ich nicht möchte. Was ist das Stilelement, um es verschwinden zu lassen?

Antworten:


481

Was ist das Stilelement, um es verschwinden zu lassen?

Um den Schatten zu entfernen, fügen Sie dies Ihrem App-Thema hinzu:

<style name="MyAppTheme" parent="android:Theme.Holo.Light">
    <item name="android:windowContentOverlay">@null</item>
</style>

UPDATE: Wie @ Quinny898 feststellte, müssen Sie unter Android 5.0, das sich geändert hat, setElevation(0)Ihre Aktionsleiste aufrufen . Beachten Sie, dass Sie, wenn Sie die Support-Bibliothek verwenden, diese folgendermaßen aufrufen müssen:

getSupportActionBar().setElevation(0);

Ist es nicht ein Stil, den Schatten unter der Statusleiste zu entfernen, nicht die Aktionsleiste?
Michał K

96
Danke, es ist verschwunden. Es ist wichtig zu beachten, dass diese Codezeile im App-Design und nicht im Aktionsleistenstil angezeigt werden sollte.
Michał K

3
Ich arbeite! Es muss klar sein, dass diese Codezeile im App Theme Tag und nicht im ActionBar Theme Tag hinzugefügt werden sollte.
Tuoxie007

Und eine andere Sache, die auch beachtet werden sollte, ist, dass Sie Ihr Thema in Werte, Werte-v11, Wert-v14 ändern sollten (wenn Sie Symbolleiste verwenden, ignorieren Sie dies)
TheOne_su

6
für Pre-Lollipop-Geräte getSupportActionBar().setElevation(0);funktioniert nicht. Sie haben also <item name="android:windowContentOverlay">@null</item>Ihr Anwendungsthema eingegeben. Ich hatte das ähnliche Problem. Jetzt habe ich beide. setElevation from und fügte windowContentOverlay-Element im Anwendungsthema hinzu. setElevation funktioniert für Android 5.0 und höher, während das andere für Pre-Lollipop funktioniert. Prost!
Reaz Murshed

140

Wenn Sie für Android 5.0 direkt einen Stil festlegen möchten, verwenden Sie:

<item name="android:elevation">0dp</item>

und für die Kompatibilität der Support-Bibliothek verwenden Sie:

<item name="elevation">0dp</item>

Beispiel für einen Stil für ein AppCompat-Lichtthema:

<style name="Theme.MyApp.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <!-- remove shadow below action bar -->
    <!-- <item name="android:elevation">0dp</item> -->
    <!-- Support library compatibility -->
    <item name="elevation">0dp</item>
</style>

Wenden Sie dann diesen benutzerdefinierten ActionBar-Stil auf Ihr App-Thema an:

<style name="Theme.MyApp" parent="Theme.AppCompat.Light">
    <item name="actionBarStyle">@style/Theme.MyApp.ActionBar</item>
</style>

Fügen Sie dies für Android vor 5.0 auch Ihrem App-Thema hinzu:

<!-- Remove shadow below action bar Android < 5.0 -->
<item name="android:windowContentOverlay">@null</item>

1
Hat bei mir für Geräte vor 5.0 nicht funktioniert. Das Problem war, dass ich das windowContentOverlayThema der Aktionsleiste hinzugefügt habe , nicht das Thema der App.
Oliv

Es tut mir leid, aber ich versuche das Gegenteil zu tun. Lassen Sie den Höhenschatten tatsächlich auf Pre-Lollipop-Geräten erscheinen (ich habe es geschafft, dies android:elevationfür Lollipop-Geräte zu tun ). Ich kann es mit diesem Ansatz nicht schaffen. Ich glaube, es wäre ziemlich gerade. Geben Sie einen Wert ungleich Null für Höhenattribute ein, und das wäre es.
Acrespo

Es sollte standardmäßig sichtbar sein, wenn Sie das Attribut android: windowContentOverlay nicht berühren. Überprüfen Sie möglicherweise, ob Sie ein korrektes Thema verwenden. Ich denke, Sie müssen ein AppCompat-Thema verwenden.
Sloosh

aber wie geht man mit der android:windowContentOverlayPre-Lollipop-API um? Ich kann nicht kompilieren, wenn mein minSDK vor dem Lutscher ist, aber das Ziel ist 21?
Opiatefuchs

2
Dies funktionierte aber nur, wenn ich <style name="Theme.MyApp.ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">ohne style/in parentAttribut verwendet habe.
Igor

103

Unter Android 5.0 hat sich dies geändert. Sie müssen setElevation (0) in Ihrer Aktionsleiste aufrufen. Beachten Sie, dass Sie, wenn Sie die Support-Bibliothek verwenden, diese folgendermaßen aufrufen müssen:

getSupportActionBar().setElevation(0);

Das Stilelement windowContentOverlay ist davon nicht betroffen, sodass keine Änderungen an den Stilen erforderlich sind


1
Müssen Sie dies für jede Aktivität tun, oder gibt es eine schnelle Methode, um sie auf alle Aktivitäten anzuwenden? Ich werde dies alle meine Aktivitäten für jetzt hinzufügen. Vielen Dank!
cnfw

Wie bei jeder anderen Actionbar-Methode (z. B. dem Titel) würde ich jede Aktivität sagen
Kieron

Das ist eine Schande. Es wäre schön, solche Parameter in der Datei styles.xml festzulegen. Vielleicht kommt das in einem zukünftigen Update
cnfw

Dies funktioniert nicht mit niedrigeren Versionen als 5.0. Soll die Support-Aktionsleiste nicht mit allen vorherigen Geräten kompatibel sein?
splinter123

wie @ splinter123 hier :( Ich frage mich, wie ich die Schatten auf Pre-Lollipop entfernen kann, wenn ich AppCompat verwende.
FD_

55

app:elevation="0dp"Fügen Sie in AppBarLayout hinzu, um Schatten in der Appbar auszublenden


1
Schauen Sie alle an, wenden Sie einfach diese Lösung an und vergessen Sie, was alle anderen gesagt haben. Danke, Mann! Es klappt! Sehr einfache Lösung!
Bruce

1
Verwenden Sie wie folgt: <android.support.design.widget.AppBarLayout android: layout_width = "match_parent" android: layout_height = "wrap_content" app: height = "0dp" android: theme = "@ style / AppTheme.AppBarOverlay">
Bharat Kul Ratan

@MarcoFerrari Verwenden Sie dies im Fall von AppBarLayout als 'getSupportActionBar (). SetElevation (0);' funktioniert nicht
Salil Dhawan

39

Wenn Sie mit ActionBarSherlock arbeiten

Fügen Sie in Ihrem Thema Folgendes hinzu:

<style name="MyTheme" parent="Theme.Sherlock">
    ....
    <item name="windowContentOverlay">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    ....
</style>

Dies ist eine bessere Antwort, es gibt das Kompatibilitätselement an
1owk3y

25

Sie müssen festgelegt app:elevation="0dp"in der android.support.design.widget.AppBarLayoutund es dann funktioniert.

<android.support.design.widget.AppBarLayout
    app:elevation="0dp"... >

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


    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>

1
Dies führt dazu, dass der Schatten der AppBar überall weg ist - wie kann ich das programmgesteuert steuern?
Suisse

14
app:elevation="0dp" 

aber nicht

android:elevation="0dp"

arbeitete für mich auf Android L.


2

Ich habe das gleiche Problem und habe dieses Problem erfolgreich gelöst. Sie müssen lediglich die Höhe in der Aktivität, in der Sie die Höhe entfernen möchten, auf 0 Gleitkommawert ändern.

Wenn Sie es in einer aufgerufenen Aktivität ändern möchten, MyActivity.javamüssen Sie die ActionBarerste erhalten.

Importieren Sie zuerst die ActionBarKlasse

import android.support.v7.app.ActionBar;

Nach dem Import müssen Sie eine Variable der Aktionsleiste initialisieren und ihre Höhe auf 0 setzen.

 private ActionBar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    .
    .
    toolbar=getSupportActionBar();
    toolbar.setElevation(0);
    .
    .
    }

1

Für Xamarin-Entwickler verwenden Sie bitte: SupportActionBar.Elevation = 0;für AppCompatActivityoder ActionBar.Elevation = 0;für nicht kompatible Aktivitäten


1

Lösung für Kotlin (Android 3.3, Kotlin 1.3.20)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    supportActionBar!!.elevation = 0f
}

Ich bin mir nicht sicher, warum dies abgelehnt wird (ich bin neu bei Kotlin), aber das hat bei mir funktioniert, wo andere es nicht getan haben
Allen Wixted

1

Versuchen Sie dies, es hat mir geholfen, ohne das Thema zu ändern. Platzieren Sie Ihr AppBarLayout in einem beliebigen Layout. Hoffentlich hilft Ihnen dies

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="false"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">


    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:layout_height="?attr/actionBarSize"
       android:background="@color/white">
        <ImageView
            android:src="@drawable/go_grocery_logo"
            android:layout_width="108dp"
            android:layout_height="32dp" />
    </android.support.v7.widget.Toolbar>


</android.support.design.widget.AppBarLayout>
</RelativeLayout>

0

Für diejenigen, die an Fragmenten arbeiten und es nach dem Setzen toolbar.getBackground().setAlpha(0);oder Verschwinden verschwunden ist, denke ich, dass Sie Ihr AppBarLayout auf das letzte in der XML bringen müssen, also sein Fragment dann AppBarLayout dann relativelayout / Einschränkung / linear, je nachdem, was Sie verwenden.


0

Fügen Sie dies toolbar.getBackground().setAlpha(0);der OnCreate-Methode hinzu. android:elevation="0dp" android:background="@android:color/transparent Fügen Sie Folgendes hinzu: zu Ihrer Symbolleisten-XML-Datei.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.