Supprimer l'ombre sous la barre d'action

208

J'utilise actionbarsherlock. Le morceau de code ci-dessous est chargé de changer son arrière-plan en un arrière-plan personnalisé.

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

Et cela fonctionne pour actionbarsherlock (sur les versions ci-dessous en nid d'abeille). Mais dans ICS, j'ai une ombre sous la barre d'action que je ne veux pas. Quel est l'élément de style pour le faire disparaître?

Michał K
la source

Réponses:

481

Quel est l'élément de style pour le faire disparaître?

Pour supprimer l'ombre, ajoutez ceci à votre thème d'application:

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

MISE À JOUR: Comme l'a indiqué @ Quinny898, sur Android 5.0, cela a changé, vous devez appeler setElevation(0)sur votre barre d'action. Notez que si vous utilisez la bibliothèque de support, vous devez l'appeler ainsi:

getSupportActionBar().setElevation(0);
Tomer Mor
la source
N'est-ce pas un style de supprimer l'ombre sous la barre d'état, pas la barre d'action?
Michał K
96
Merci, il a disparu. Une chose importante à noter est que cette ligne de code doit apparaître dans le thème de l'application, pas dans le style de la barre d'action.
Michał K
3
Je travail! Ce qui doit être clair, c'est que cette ligne de code doit être ajoutée dans la balise de thème d'application, et non dans la balise de thème ActionBar.
tuoxie007
Et une autre chose qui doit également être notée est que vous devez changer votre thème dans les valeurs, values-v11, value-v14 (si vous utilisez la barre d'outils, ignorez cela)
TheOne_su
6
pour les appareils pré-sucette getSupportActionBar().setElevation(0);ne fonctionne pas. Vous avez donc mis <item name="android:windowContentOverlay">@null</item>votre thème d'application. J'ai eu le même problème. Maintenant, je les ai tous les deux. setElevation et ajout de l'élément windowContentOverlay dans le thème de l'application. setElevation fonctionne pour Android 5.0 et plus tandis que l'autre fonctionne pour pré-sucette. À votre santé!
Reaz Murshed
141

Pour Android 5.0, si vous souhaitez le définir directement dans un style, utilisez:

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

et pour l'utilisation de la compatibilité de la bibliothèque de support:

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

Exemple de style pour un thème lumineux 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>

Ensuite, appliquez ce style ActionBar personnalisé à votre thème d'application:

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

Pour la version antérieure à Android 5.0, ajoutez-la également à votre thème d'application:

<!-- Remove shadow below action bar Android < 5.0 -->
<item name="android:windowContentOverlay">@null</item>
Sloosh
la source
1
Ne fonctionnait pas pour moi pour les appareils pré 5.0. Le problème était que j'ai ajouté le windowContentOverlayau thème de la barre d'action, pas au thème de l'application.
Oliv
Je suis désolé, mais j'essaie de faire la chose opposée, faire apparaître l'ombre d'élévation sur les appareils pré-sucettes (j'ai réussi à le faire android:elevationpour les appareils Lollipop). Je n'arrive pas à le faire, en utilisant cette approche. Je pense que ce serait assez simple. Mettez une valeur non nulle pour les attributs d'élévation et c'est tout.
acrespo
Il devrait être visible par défaut si vous ne touchez pas à l'attribut android: windowContentOverlay, vérifiez peut-être que vous utilisez un thème correct ... Je pense que vous devez utiliser un thème AppCompat.
Sloosh
mais comment faire face à l' android:windowContentOverlayAPI pré lollipop? Je ne peux pas compiler si mon minSDK est pré-sucette mais la cible est 21?
Opiatefuchs
2
Cela a fonctionné , mais seulement quand je <style name="Theme.MyApp.ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">sans style/en parentattribut.
Igor
103

Sur Android 5.0, cela a changé, vous devez appeler setElevation (0) sur votre barre d'action. Notez que si vous utilisez la bibliothèque de support, vous devez l'appeler ainsi:

getSupportActionBar().setElevation(0);

Il n'est pas affecté par l'élément de style windowContentOverlay, donc aucune modification des styles n'est requise

Kieron
la source
1
Devez-vous le faire pour chaque activité ou existe-t-il une méthode rapide pour l'appliquer à toutes les activités? Je vais ajouter toutes mes activités pour l'instant. Merci!
cnfw
Comme c'est comme n'importe quelle autre méthode de la barre d'action (par exemple le titre), je dirais que chaque activité
Kieron
C'est une honte. Ce serait bien de définir des paramètres comme celui-ci dans le fichier styles.xml. Peut-être que cela viendra dans une future mise à jour
cnfw
cela ne fonctionne pas sur les versions inférieures à 5.0. La barre d'action de support n'est-elle pas censée être compatible avec tous les appareils précédents?
splinter123
Identique à @ splinter123 ici :( Je me demande comment je peux supprimer les ombres sur pré-Lollipop lors de l'utilisation d'AppCompat.
FD_
55

ajouter app:elevation="0dp"dans AppBarLayout pour masquer l'ombre dans la barre d'applications

Vijay Vavdiya
la source
1
Regardez tout le monde, appliquez simplement cette solution et oubliez ce que tout le monde a dit. Merci mec! Ça marche! Solution très simple!
S bruce
1
Utilisez comme ceci: <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 Utilisez ceci dans le cas de AppBarLayout comme 'getSupportActionBar (). SetElevation (0);' ne fonctionne pas.
Salil Dhawan
39

Si vous travaillez avec ActionBarSherlock

Dans votre thème, ajoutez ceci:

<style name="MyTheme" parent="Theme.Sherlock">
    ....
    <item name="windowContentOverlay">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    ....
</style>
Dmitry Zaytsev
la source
c'est une meilleure réponse, elle spécifie l'élément de compatibilité
1owk3y
25

Vous devez définir app:elevation="0dp"dans le android.support.design.widget.AppBarLayoutpuis cela fonctionne.

<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
la source
1
cela provoque, que l'ombre de l'AppBar est partout - comment puis-je contrôler cela par programme?
Suisse
14
app:elevation="0dp" 

mais non

android:elevation="0dp"

travaillé pour moi sur android L

YTerle
la source
2

J'ai ce même problème et j'ai réussi à résoudre ce problème. Tout ce que vous avez à faire est simplement de changer l'élévation à 0 en virgule flottante dans l'activité dans laquelle vous souhaitez supprimer l'élévation.

Si vous voulez le changer dans une activité appelée MyActivity.java, vous devez donc obtenir leActionBar premier.

Importez d'abord la ActionBarclasse

import android.support.v7.app.ActionBar;

après l'importation, vous devez initialiser une variable de la barre d'action et définir son élévation à 0.

 private ActionBar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    .
    .
    toolbar=getSupportActionBar();
    toolbar.setElevation(0);
    .
    .
    }
shubham gupta
la source
1

Pour les développeurs Xamarin, veuillez utiliser: SupportActionBar.Elevation = 0;pour AppCompatActivityou ActionBar.Elevation = 0;pour les activités non compatibles

BYISHIMO Audace
la source
1

Solution pour Kotlin (Android 3.3, Kotlin 1.3.20)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    supportActionBar!!.elevation = 0f
}
zeeshan
la source
Je ne sais pas pourquoi cela est rejeté (je suis nouveau chez Kotlin) mais cela a fonctionné pour moi là où les autres ne l'ont pas fait
Allen Wixted
1

Essayez ceci, cela m'a aidé sans changer de thème. Mettez votre AppBarLayout dans n'importe quelle mise en page. J'espère que cela vous aidera

<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
la source
0

Pour ceux qui travaillent sur des fragments et il a disparu après la définition toolbar.getBackground().setAlpha(0);ou toute disparition, je pense que vous devez amener votre AppBarLayout au dernier du xml, donc son Fragment puis AppBarLayout puis relativelayout / constraint / linear quelle que soit l'utilisation que vous utilisez.

Bowie Chang
la source
0

Ajoutez ceci toolbar.getBackground().setAlpha(0);à l'intérieur de la méthode OnCreate. Ajoutez ceci: android:elevation="0dp" android:background="@android:color/transparent à votre fichier xml de barre d'outils.

Collins Ushi
la source