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.