Récemment, j'ai lu ces articles:
Bibliothèque de conception Android
bibliothèque de support Android, révision 22.2.
Mais aucun d’entre eux ne m’a donné un exemple détaillé sur la création d’une nouvelle FloatingActionButton
. Si difficile à comprendre, je pose cette question.
Quelqu'un peut-il me donner un exemple à ce sujet?
Toute aide beaucoup soit appréciée. Merci d'avance.
EDIT
Je viens de trouver quelques problèmes sur FloatingActionButton
(FAB) et je souhaite améliorer une autre réponse. Voir ma réponse ci-dessous.
Donc, dans votre fichier build.gradle
, ajoutez ceci:
compile 'com.Android.support:design:27.1.1'
AndroidX Remarque: Google introduit de nouvelles bibliothèques d'extension AndroidX pour remplacer les anciennes bibliothèques de support. Pour utiliser AndroidX, assurez-vous d’abord que vous avez mis à jour votre fichier gradle.properties
, modifié build.gradle
pour définir compileSdkVersion
sur 28
(ou une version ultérieure), et utilisez la ligne suivante au lieu de la précédente compile
.
implementation 'com.google.Android.material:material:1.0.0'
Ensuite, dans votre themes.xml
ou styles.xml
ou quoi que ce soit, assurez-vous de définir ceci: c'est la couleur d'accent de votre application, et la couleur de votre FAB, à moins que vous ne le remplaciez (voir ci-dessous):
<item name="colorAccent">@color/floating_action_button_color</item>
Dans le XML de la mise en page:
<RelativeLayout
...
xmlns:app="http://schemas.Android.com/apk/res-auto">
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/myFAB"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/ic_plus_sign"
app:elevation="4dp"
... />
</RelativeLayout>
Ou si vous utilisez la bibliothèque de matériaux AndroidX ci-dessus, utilisez plutôt ceci:
<RelativeLayout
...
xmlns:app="http://schemas.Android.com/apk/res-auto">
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:id="@+id/myFAB"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:srcCompat="@drawable/ic_plus_sign"
app:elevation="4dp"
... />
</RelativeLayout>
Vous pouvez voir plus d'options dans docs(documents matériels ici) (setRippleColor
, etc.), mais l'une des remarques est:
app:fabSize="mini"
Un autre intéressant - pour changer la couleur de fond d'un seul FAB, ajoutez:
app:backgroundTint="#FF0000"
(par exemple pour le changer en rouge) au XML ci-dessus.
Quoi qu'il en soit, dans le code, une fois que la vue de l'activité/du fragment est gonflée ...
FloatingActionButton myFab = (FloatingActionButton) myView.findViewById(R.id.myFAB);
myFab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
doMyThing();
}
});
Observations:
Voici un moyen de supprimer ou de modifier le remplissage s'il y en a trop:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) myFab.getLayoutParams();
p.setMargins(0, 0, 0, 0); // get rid of margins since shadow area is now the margin
myFab.setLayoutParams(p);
}
En outre, j'allais placer par programme la FAB sur la "couture" entre deux zones d'un RelativeLayout en saisissant la hauteur de la FAB, en la divisant par deux, et en utilisant cela comme décalage de marge. Mais myFab.getHeight () retournait zéro, même après que la vue ait été gonflée, semblait-il. Au lieu de cela, j'ai utilisé un ViewTreeObserver pour obtenir la hauteur uniquement après l'avoir définie, puis définir la position. Voir cette astuce ici . Cela ressemblait à ceci:
ViewTreeObserver viewTreeObserver = closeButton.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
closeButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
closeButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
// not sure the above is equivalent, but that's beside the point for this example...
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) closeButton.getLayoutParams();
params.setMargins(0, 0, 16, -closeButton.getHeight() / 2); // (int left, int top, int right, int bottom)
closeButton.setLayoutParams(params);
}
});
}
Pas sûr que ce soit la bonne façon de le faire, mais cela semble fonctionner.
Si vous voulez que le FAB soit sur une "couture", vous pouvez utiliser layout_anchor
et layout_anchorGravity
, voici un exemple:
<Android.support.design.widget.FloatingActionButton
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
Android:src="@drawable/ic_discuss"
Android:layout_margin="@dimen/fab_margin"
Android:clickable="true"/>
Rappelez-vous que vous pouvez automatiquement faire sauter le bouton quand un Snackbar apparaît en l'enveloppant dans un CoordinatorLayout .
Plus:
Je viens de trouver quelques problèmes sur FAB et je souhaite améliorer une autre réponse.
Ainsi, le problème viendra une fois que vous aurez défini la couleur d'ondulation (couleur FAB activée) par programme via setRippleColor
. Mais nous avons toujours une autre façon de le définir, c’est-à-dire en appelant:
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
ColorStateList rippleColor = ContextCompat.getColorStateList(context, R.color.fab_ripple_color);
fab.setBackgroundTintList(rippleColor);
Votre projet doit avoir cette structure:
/res/color/fab_ripple_color.xml
Et le code de fab_ripple_color.xml
est:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:color="@color/fab_color_pressed" />
<item Android:state_focused="true" Android:color="@color/fab_color_pressed" />
<item Android:color="@color/fab_color_normal"/>
</selector>
Enfin, modifiez légèrement votre FAB:
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/ic_action_add"
Android:layout_alignParentBottom="true"
Android:layout_alignParentRight="true"
app:fabSize="normal"
app:borderWidth="0dp"
app:elevation="6dp"
app:pressedTranslationZ="12dp"
app:rippleColor="@Android:color/transparent"/> <!-- set to transparent color -->
Pour les API de niveau 21 et supérieur, définissez la marge droite et inférieure à 24dp:
...
Android:layout_marginRight="24dp"
Android:layout_marginBottom="24dp" />
Comme vous pouvez le voir sur mon code XML FAB ci-dessus, j'ai défini:
...
Android:layout_alignParentBottom="true"
Android:layout_alignParentRight="true"
app:elevation="6dp"
app:pressedTranslationZ="12dp"
...
En définissant ces attributs, vous n'avez pas besoin de redéfinir layout_marginTop
et layout_marginRight
(uniquement sur les versions antérieures à Lollipop). Android le placera automatiquement sur le côté droit de l'écran, ce qui est identique à FAB normal dans Android Lollipop.
Android:layout_alignParentBottom="true"
Android:layout_alignParentRight="true"
Ou, vous pouvez utiliser ceci dans CoordinatorLayout
:
Android:layout_gravity="end|bottom"
elevation
et de 12dp pressedTranslationZ
, selon ce guide de Google.FloatingActionButton
étend ImageView
. Donc, c'est simple, comme si vous introduisiez un ImageView
dans votre mise en page. Voici un exemple XML.
<Android.support.design.widget.FloatingActionButton xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/somedrawable"
Android:layout_gravity="right|bottom"
app:borderWidth="0dp"
app:rippleColor="#ffffff"/>
app:borderWidth="0dp"
est ajouté comme solution de contournement pour les problèmes d'élévation.
pour AndroidX utiliser comme
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" />