J'utilise le nouveau FloatingActionButton de la bibliothèque de conception Google et j'obtiens d'étranges problèmes de remplissage / marge. Cette image (avec les options de mise en page du développeur activées) provient de l'API 22.
Et de l'API 17.
C'est le XML
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_gravity="bottom|right"
android:layout_marginLeft="16dp"
android:layout_marginRight="20dp"
android:layout_marginTop="-32dp"
android:src="@drawable/ic_action_add"
app:fabSize="normal"
app:elevation="4dp"
app:borderWidth="0dp"
android:layout_below="@+id/header"/>
Pourquoi le FAB de l'API 17 est-il tellement plus grand en termes de remplissage / marge?
CoordinatorLayout
pour l'aligner verticalement et le globe oculaire du rembourrage supplémentaire pré-sucette. Vous pouvez le comprendre à partir des sources FAB décompilées, mais je préfère attendre que Google le répare comme ils l'ont fait pourCardView
.Réponses:
Mise à jour (octobre 2016):
La bonne solution est maintenant de mettre
app:useCompatPadding="true"
dans votre FloatingActionButton. Cela rendra le remplissage cohérent entre les différentes versions d'API. Cependant, cela semble encore réduire légèrement les marges par défaut, vous devrez peut-être les ajuster. Mais au moins, il n'y a plus besoin de styles spécifiques à l'API.Réponse précédente:
Vous pouvez accomplir cela facilement en utilisant des styles spécifiques à l'API. Dans votre normal
values/styles.xml
, mettez quelque chose comme ceci:puis sous values-v21 / styles.xml, utilisez ceci:
et appliquez le style à votre FloatingActionButton:
Comme d'autres l'ont noté, dans l'API <20, le bouton rend sa propre ombre, ce qui ajoute à la largeur logique globale de la vue, tandis que dans l'API> = 20, il utilise les nouveaux paramètres d'élévation qui ne contribuent pas à la largeur de la vue.
la source
elevation
vous avez défini sur le FAB.app:useCompatPadding="true"
Plus besoin de jouer avec
styles.xml
ou avec des.java
fichiers. Laissez-moi faire simple.La marge / rembourrage supplémentaire que vous avez vu sur le FAB dans votre deuxième image est dû à ce compatPadding sur les appareils pré-sucette . Si cette propriété n'est pas définie, elle est appliquée sur les appareils pré-lollopop et NON sur les appareils lollipop +.
Preuve de concept
la source
après quelques recherches et tests de solution, je résout mon problème en ajoutant cette ligne uniquement à ma mise en page XML:
et c'est toute ma disposition de bouton flottant
la source
useCompatPadding
ni rien d'autre n'obtient le même résultat.Il y a un problème dans la bibliothèque de support de conception. Utilisez la méthode ci-dessous pour résoudre ce problème jusqu'à ce que la bibliothèque soit mise à jour. Essayez d'ajouter ce code à votre activité ou fragment pour résoudre le problème. Gardez votre xml le même. Sur la sucette et au-dessus il n'y a pas de marge mais en dessous il y a une marge de 16dp.
Mettre à jour l'exemple de travail
XML - FAB est dans un RelativeLayout
Java
Convertir dp en px
Sucette
Pré sucette
la source
RelativeLayout.LayoutParams
ne peut pas être converti enLayoutParams
deFloatingActionButton
et je ne vois aucune marge de 16dp sur pré Lollipop. La largeur duFloatingActionButton
pré Lollipop est de 84dp au lieu de 56dp et sa hauteur est de 98dp.View.getLayoutParams
renvoie aLayoutParams
du type deView
est dans - dans le cas d'Eugene, c'est unRelativeLayout.LayoutParams
.Sur pré Lollipop
FloatingActionButton
est responsable de dessiner sa propre ombre. Par conséquent, la vue doit être légèrement plus grande pour faire de la place pour l'ombre. Pour obtenir un comportement cohérent, vous pouvez définir des marges pour tenir compte de la différence de hauteur et de largeur. J'utilise actuellement la classe suivante :Mise à jour: les bibliothèques de support Android v23 ont renommé fab_size dimens en:
la source
La réponse de Markus a bien fonctionné pour moi après la mise à jour vers la v23.1.0 et après avoir fait quelques ajustements aux importations (avec le récent plugin gradle, nous utilisons notre application R au lieu du R de la bibliothèque de conception). Voici le code pour la v23.1.0:
la source
Dans le fichier de mise en page, définissez l'élévation de l'attribut sur 0. car il prend l'élévation par défaut.
Maintenant, dans l'activité, vérifiez le niveau de l'API supérieur à 21 et définissez l'élévation si nécessaire.
la source