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ął?

Michał K.
źródło

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);
Tomer Mor
źródło
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>
Sloosh
źródło
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

Kieron
źródło
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

Vijay Vavdiya
źródło
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>
Dmitrij Zajcew
źródło
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>
Nguyên Phạm
źródło
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.

YTerle
źródło
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);
    .
    .
    }
Shubham Gupta
źródło
1

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

BYISHIMO Audace
źródło
1

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

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    supportActionBar!!.elevation = 0f
}
zeeshan
źródło
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>
Rahul
źródło
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.

Bowie Chang
źródło
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.

Collins Ushi
źródło