web-dev-qa-db-fra.com

Comment pouvez-vous ajuster Android SnackBar à une position spécifique sur l'écran

Après le nouveau snack-bar Android, j'essaie de le positionner sur une coordonnée y spécifique. Cela ne semble même pas possible.

J'ai essayé d'obtenir le point de vue du parent du snack-bar, mais il n'y a rien à faire au parent pour que celui-ci en définisse la position.

mSnackBar.getView().getParent();

Lors de la fouille dans la classe réelle, il existe une instance de mView et mParent qui est privée et qui ne peut pas être atteinte de toute façon.

https://developer.Android.com/reference/Android/support/design/widget/Snackbar.html

13
Dus

Il est possible de définir l'emplacement d'affichage de la barre Snackbar en plaçant un Android.support.design.widget.CoordinatorLayout dans votre structure d'activité existante.

Par exemple, supposons que votre présentation existante soit une RelativeLayout, vous pouvez ajouter une CoordinatorLayout comme suit:

<Android.support.design.widget.CoordinatorLayout
    Android:layout_width="match_parent"
    Android:layout_height="200dp"
    Android:id="@+id/myCoordinatorLayout"
    Android:layout_alignParentTop="true"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentStart="true">
</Android.support.design.widget.CoordinatorLayout>

Ensuite, assurez-vous de passer la CoordinatorLayout comme premier argument de la commande Snackbar.make().

final View viewPos = findViewById(R.id.myCoordinatorLayout);    
Snackbar.make(viewPos, R.string.snackbar_text, Snackbar.LENGTH_LONG)
                            .setAction(R.string.snackbar_action_undo, showListener)
                            .show();

Cela aura pour effet d’afficher la barre dans le en bas de la CoordinatorLayout fournie à la fonction make ().

Si vous transmettez une View qui n'est pas une CoordinatorLayout, la barre de progression remontera dans l’arbre jusqu’à ce qu’elle trouve une CoordinatorLayout ou la racine de la présentation.

45
BrentM

Définir explicitement une mise en page pour le Snackbar peut ne pas toujours être pratique. 

Le problème semble avoir ciblé le parent, plutôt que la Snackbar.

Snackbar snackbar = Snackbar.make(layout, message, duration);
View snackbarLayout = snackbar.getView();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT, 
    LinearLayout.LayoutParams.WRAP_CONTENT
);
// Layout must match parent layout type
lp.setMargins(50, 0, 0, 0);
// Margins relative to the parent view.
// This would be 50 from the top left.
snackbarLayout.setLayoutParams(lp);
snackbar.show();
0
Abandoned Cart