web-dev-qa-db-fra.com

Comment modifier l'alignement initial d'un Snackbar Android de bas en haut?

La récente bibliothèque Android est sortie il y a quelques jours à peine, mais j'aimerais que SnackBar apparaisse en haut de l'écran, de préférence dans un RelativeLayout en tant que vue parent.

Comment peut-on changer l'alignement initial de SnackBar, que je présume être layout_alignParentBottom en layout_alignParentTop?

13
apollow

Il est possible de faire apparaître la barre en haut de l'écran en utilisant ceci:

Snackbar snack = Snackbar.make(parentLayout, str, Snackbar.LENGTH_LONG);
View view = snack.getView();
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams();
params.gravity = Gravity.TOP;
view.setLayoutParams(params);
snack.show()

Remarque: l'animation du snack-bar commence du bas vers le haut de l'écran, comme prévu, car elle était censée être au bas de la réponse de ianhanniballake.

Pour les notifications qui montent du haut, il serait probablement préférable d’obtenir une bannière personnalisée à la place.

29
apollow

Non, selon la conception du matériau spéc. Pour Snackbars :

Les barres de collation fournissent un retour d'information léger sur une opération en affichant un bref message en bas de l'écran.

La bibliothèque de conceptions cherchant à mettre en œuvre les spécifications de conception des matériaux, il est impossible de positionner la barre dans une position autre que le bas de l'écran (ou contenant CoordinatorLayout).

13
ianhanniballake

Voici un moyen simple d’ajouter SnackBar en utilisant CoordinatorLayout en haut de l’écran, mais l’animation reste un problème.

Ajoutez simplement une mise en page CoordinatorLayout à votre mise en page, comme suit:

<Android.support.design.widget.CoordinatorLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentTop="true"
    Android:layout_centerHorizontal="true"
    Android:id="@+id/snackbarlocation">
</Android.support.design.widget.CoordinatorLayout>

puis dans votre activité, obtenez une référence et transmettez-la à la barre Snack comme ci-dessous:

    CoordinatorLayout Clayout = (CoordinatorLayout)findViewById(R.id.snackbarlocation);

    FabButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Snackbar.make(Clayout, "This snack bar located at top", Snackbar.LENGTH_SHORT).show();
        }
    });

Crédits

4
Atul O Holic

Eh bien, vous pouvez obtenir le layoutparam de snackbar et changer le bottomMargin dans le code ... comme. 

Snackbar snackbar = Snackbar.make(rootView, message, Snackbar.LENGTH_LONG);
View view = snackbar.getView();
FrameLayout.LayoutParams para = (CoordinatorLayout) view.getLayoutParams();
params.bottomMargin = showAtLocation // pass your location offset here
view.setLayoutParams(params);

Ensuite, vous pouvez utiliser l'instance de snackbar pour montrer quand vous voulez

snackbar.show();
1
Cheng

Cela peut être fait de manière simple

d'abord créer la mise en page où snackbar doit être inclus

<LinearLayout
    Android:id="@+id/info_container"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"/>

puis en code

  ll_mesg.addView(Snackbar.make(ll_mesg, "Please choose your luck from one of box", Snackbar.LENGTH_LONG)
            .getView());
    new Handler().postDelayed(new Runnable() {
        public void run() {
            ll_mesg.removeAllViews();
            }
        }
        ,1000);
1
yubaraj poudel