Usuń cień pod paskiem akcji


208

Używam Actionbarsherlock. Poniższy fragment kodu jest odpowiedzialny za zmianę jego tła na niestandardowe.

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

I działa dla actionbarsherlock (w wersjach poniżej plastra miodu). Ale w ICS mam cień pod paskiem akcji, którego nie chcę. Jaki jest styl, aby zniknął?

Odpowiedzi:


481

Jaki jest styl, aby zniknął?

Aby usunąć cień, dodaj go do motywu aplikacji:

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

AKTUALIZACJA: Jak stwierdził @ Quinny898, w Androidzie 5.0 to się zmieniło, musisz zadzwonić setElevation(0)na pasku akcji. Pamiętaj, że jeśli korzystasz z biblioteki wsparcia, musisz nazwać ją tak:

getSupportActionBar().setElevation(0);

Czy to nie jest styl usuwania cienia poniżej paska stanu, a nie paska akcji?
— Michał K

96
Dzięki, zniknął. Należy zauważyć, że ten wiersz kodu powinien pojawiać się w motywie aplikacji, a nie w stylu paska akcji.
— Michał K

3
Ja pracuje Należy wyjaśnić, że ten wiersz kodu należy dodać w tagu motywu aplikacji, a nie w znaczniku motywu ActionBar.
— tuoxie007

Inną rzeczą, na którą należy również zwrócić uwagę, jest to, że powinieneś zmienić motyw w wartości, wartości-v11, wartość-v14 (jeśli używasz paska narzędzi, zignoruj ​​to)
— TheOne_su

6
dla urządzeń sprzed wersji Lollipop getSupportActionBar().setElevation(0);nie działa. Więc umieściłeś <item name="android:windowContentOverlay">@null</item>motyw aplikacji. Miałem podobny problem. Teraz mam ich obu. setElevation i dodano element windowContentOverlay w temacie aplikacji. setElevation działa na Androidzie 5.0 i nowszych, podczas gdy inne działają na wersji pre-Lollipop. Twoje zdrowie!
— Reaz Murshed

140

W przypadku Androida 5.0, jeśli chcesz ustawić go bezpośrednio w stylu, użyj:

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

i do kompatybilności z biblioteką wsparcia użyj:

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

Przykład stylu dla lekkiej kompozycji AppCompat:

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

Następnie zastosuj ten niestandardowy styl ActionBar do motywu aplikacji:

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

W przypadku Androida w wersji starszej niż 5.0 dodaj to również do motywu aplikacji:

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

1
Nie działało dla mnie dla urządzeń starszych niż 5.0. Problem polegał na tym, że dodałem windowContentOverlaymotyw do paska akcji, a nie motyw aplikacji.
— Oliv

Przykro mi, ale próbuję zrobić coś odwrotnego: Spraw, aby cień elewacji pojawił się na urządzeniach sprzed Lollipopa (udało mi się to zrobić android:elevationdla urządzeń Lollipop). Nie mogę tego zrobić, używając tego podejścia. Uważam, że byłoby to dość proste. Wpisz niezerową wartość atrybutów wysokości i to by było na tyle.
— zgodnie z

Powinien być domyślnie widoczny, jeśli nie dotkniesz atrybutu android: windowContentOverlay, może sprawdź, czy używasz poprawnego motywu ... Myślę, że musisz użyć motywu AppCompat.
— Sloosh,

ale jak radzić sobie z android:windowContentOverlayAPI pre Lollipop? Nie mogę skompilować, jeśli mój minSDK jest w wersji wcześniejszej niż Lollipop, ale celem jest 21?
— Opiatefuchs

2
To działało, ale tylko wtedy, gdy stosowane <style name="Theme.MyApp.ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">bez style/w parentatrybucie.
— Igor

103

W Androidzie 5.0 to się zmieniło, musisz wywołać setElevation (0) na pasku akcji. Pamiętaj, że jeśli korzystasz z biblioteki wsparcia, musisz nazwać ją tak:

getSupportActionBar().setElevation(0);

Element stylu windowContentOverlay nie ma na to wpływu, więc nie są wymagane żadne zmiany stylów


1
Czy musisz to robić dla każdego działania, czy też istnieje szybka metoda na zastosowanie go do wszystkich działań? Na razie dodam to do wszystkich moich działań. Dzięki!
— cnfw

Ponieważ jest to jak każda inna metoda paska akcji (np. Tytuł), powiedziałbym, że każda aktywność
— Kieron

Jaka szkoda. Byłoby miło ustawić takie parametry w pliku styles.xml. Może to nadejdzie w przyszłej aktualizacji
— cnfw

nie działa to w wersjach niższych niż 5.0. Czy pasek akcji pomocy technicznej nie powinien być zgodny ze wszystkimi poprzednimi urządzeniami?
— splinter123

tak samo jak @ splinter123 tutaj :( Zastanawiam się, jak mogę usunąć cienie z wersji pre-Lollipop podczas korzystania z AppCompat.
— FD_

55

dodaj app:elevation="0dp"AppBarLayout, aby ukryć cień w pasku aplikacji


1
Spójrz wszyscy, po prostu zastosuj to rozwiązanie i zapomnij o tym, co powiedzieli inni. Dzięki! to działa! Bardzo proste rozwiązanie!
— S bruce,

1
Użyj w następujący sposób: <android.support.design.widget.AppBarLayout android: layout_width = "match_parent" android: layout_height = "wrap_content" app: elevation = "0dp" android: theme = "@ style / AppTheme.AppBarOverlay">
— Bharat Kul Ratan,

@MarcoFerrari Użyj tego w przypadku AppBarLayout jako 'getSupportActionBar (). SetElevation (0);' nie działa
— Salil Dhawan

39

Jeśli pracujesz z ActionBarSherlock

Dodaj do motywu:

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

jest to lepsza odpowiedź, określa pozycję zgodności
— 1owk3y

25

Musisz ustawić app:elevation="0dp"w android.support.design.widget.AppBarLayouti wtedy to działa.

<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
powoduje to, że cień AppBar jest wszędzie daleko - jak mogę to programowo kontrolować?
— Suisse,

14
app:elevation="0dp" 

ale nie

android:elevation="0dp"

pracował dla mnie na Androidzie L.


2

Mam ten sam problem i udało mi się go rozwiązać. Wszystko, co musisz zrobić, to po prostu zmienić rzędną na wartość zmiennoprzecinkową w tym działaniu, w którym chcesz usunąć rzędną.

Jeśli chcesz to zmienić w działaniu o nazwie MyActivity.java, musisz zdobyć ActionBarpierwszy.

Najpierw zaimportuj ActionBarklasę

import android.support.v7.app.ActionBar;

po zaimportowaniu musisz zainicjować zmienną paska akcji i ustawić jego wysokość na 0.

 private ActionBar toolbar;

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

1

W przypadku programistów Xamarin użyj: SupportActionBar.Elevation = 0;dla działań niezgodnych AppCompatActivitylub ActionBar.Elevation = 0;niezgodnych


1

Rozwiązanie dla Kotlin (Android 3.3, Kotlin 1.3.20)

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

Nie jestem pewien, dlaczego jest to przegłosowane (jestem nowy w Kotlin), ale działało to dla mnie tam, gdzie inni nie
— Allen Wixted

1

Spróbuj To pomogło mi bez zmiany motywu. Umieść swój AppBarLayout w dowolnym układzie. Mam nadzieję, że ci to pomoże

<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

Dla tych, którzy pracują nad fragmentami i zniknęli po ustawieniu toolbar.getBackground().setAlpha(0);lub zniknięciu, myślę, że musisz doprowadzić AppBarLayout do ostatniego miejsca w xml, więc jego Fragment to AppBarLayout, a następnie relatywny układ / ograniczenie / liniowy, w zależności od tego, którego używasz.


0

Dodaj to toolbar.getBackground().setAlpha(0);do metody OnCreate. Dodaj to: android:elevation="0dp" android:background="@android:color/transparent do pliku xml paska narzędzi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.