Je mets à jour mon application avec la nouvelle barre d'outils de la bibliothèque de support v21. Mon problème est que la barre d'outils ne projette aucune ombre si je ne règle pas l'attribut "élévation". Est-ce le comportement normal ou je fais quelque chose de mal?
Mon code est:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_awesome_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent">
.
.
.
Et dans mon activité - méthode OnCreate:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
android
android-5.0-lollipop
material-design
android-toolbar
Mr. Brightside
la source
la source
Réponses:
J'ai fini par définir ma propre ombre portée pour la barre d'outils, j'ai pensé que cela pourrait être utile pour ceux qui la recherchent:
@ drawable / toolbar_dropshadow:
@ couleur / color_alizarine
la source
android:layout_height="4dp"
la hauteur de l'ombre, au lieu de5dp
. En fait, l'élévation est la même que la hauteur de l'ombre que vous avez définieFrameLayout
.Google a publié la bibliothèque Design Support il y a quelques semaines et il existe une solution astucieuse à ce problème dans cette bibliothèque.
Ajoutez la bibliothèque Design Support en tant que dépendance dans
build.gradle
:Ajoutez
AppBarLayout
fourni par la bibliothèque comme enveloppe autour de votreToolbar
mise en page pour générer une ombre portée.Voici le résultat:
Il existe de nombreuses autres astuces avec la bibliothèque de support de conception.
AndroidX
Comme ci-dessus mais avec dépendance:
et
com.google.android.material.appbar.AppBarLayout
la source
AppBarLayout
comme un wrapper autour deToolbar
ne définit aucune ombre pour moi. Notez que je n'utilise pas de tiroir de navigation. Des idées sur pourquoi cela ne fonctionne pas?Vous ne pouvez pas utiliser l'attribut d'élévation avant l'API 21 (Android Lollipop). Vous pouvez cependant ajouter l'ombre par programme, par exemple en utilisant une vue personnalisée placée sous la barre d'outils.
@ layout / toolbar
@ drawable / toolbar_dropshadow
dans votre plan d'activité
<include layout="@layout/toolbar" />
la source
@layout/toolbar
exemple avec le fichier de mise en page complet?Utilisez les dossiers / values pour appliquer le style d'ombre correct en fonction de la version du système d'exploitation.
Pour les appareils sous 5.0 , utilisez /values/styles.xml pour ajouter windowContentOverlay au corps de votre activité:
Ajoutez ensuite votre propre ombre personnalisée en modifiant votre thème pour inclure:
Vous pouvez récupérer la ressource d'ombre d'application IO de Google ici: https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png
Pour les appareils 5.0 et plus récents , utilisez /values-v21/styles.xml pour ajouter une élévation à votre barre d'outils à l'aide d'un style d'en-tête personnalisé:
Notez que dans le second cas, j'ai dû créer un style MyViewArea vide pour que windowContentOverlay n'apparaisse pas également.
[Mise à jour: modification des noms de ressources et ajout de Google Shadow.]
la source
android:foreground
que cela ne fonctionne que sur FrameLayout avant l'API 23.Cela a très bien fonctionné pour moi:
la source
Si vous définissez
ToolBar
comme,ActionBar
appelez simplement:Remarque: il doit être appelé après
setSupportActionBar(toolbar);
la source
setElevation()
est défini uniquement pour l'API-21 +.ViewCompat.setElevation()
et ne fonctionnera donc que sur l'API 21 et plus.J'ai ajouté
dans la description de la barre d'outils et cela fonctionne pour moi. Utilisation de 5.0+
la source
C'est le comportement normal. Consultez également la FAQ à la fin de cet article .
la source
J'ai joué avec ça pendant des heures, voici ce qui a fonctionné pour moi.
Supprimez tous les
elevation
attributs des widgetsappBarLayout
etToolbar
(y comprisstyles.xml
si vous appliquez un style).Maintenant, dans l'activité, appliquez le
elvation
sur votreactionBar
:Cela devrait fonctionner.
la source
setElevation
prend un paramètre en pixels. Vous devez le convertir de manière appropriée, par exemple(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
Vous pouvez également le faire fonctionner avec
RelativeLayout
. Cela réduit un peu l'imbrication de la disposition;)la source
Tout ce dont vous avez besoin est un
android:margin_bottom
égal à laandroid:elevation
valeur. NonAppBarLayout
,clipToPadding
etc. requis.Exemple:
la source
Pour 5.0 +: vous pouvez utiliser AppBarLayout avec Toolbar. AppBarLayout a l'attribution "élévation".
la source
actionbar_background.xml
ajouter à l'arrière-plan actionbar_style
name = "displayOptions"> useLogo | showHome | showTitle | showCustom
ajouter à Basetheme
la source
La plupart des solutions fonctionnent bien ici. Voudrais montrer une autre alternative similaire:
gradle:
Votre mise en page peut avoir une vue de la barre d'outils, et une ombre pour elle, ci-dessous, similaire à celle-ci (besoin de modification bien sûr):
res / drawable-v21 / toolbar_action_bar_shadow.xml
res / drawable / toolbar_action_bar_shadow.xml
res / drawable / msl__action_bar_shadow.xml
styles.xml
MainActivity.kt
Exemple complet ici , comme j'ai remarqué que l'EDI a un bogue indiquant que l'
foreground
attribut est trop nouveau pour être utilisé ici.la source
J'ai eu un problème similaire avec l'ombre. L'ombre est dessinée par le parent direct d'AppBarLayout dans mon cas. Si la hauteur du parent est la même que celle de AppBarLayout, l'ombre ne peut pas être dessinée. Donc, vérifier la taille de la mise en page parent et peut-être la refaire de la mise en page peut résoudre le problème. https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/
la source
La bonne réponse sera d'ajouter
android: backgroundTint = "# ff00ff" à la barre d'outils avec android: background = "@ android: color / white"
Si vous utilisez une autre couleur que le blanc pour l'arrière-plan, cela supprimera l'ombre. Nice one Google!
la source