Comment afficher Snackbar lorsque l'activité commence?

99

Je veux montrer Android Snackbar (android.support.design.widget.Snackbar)lorsque l'activité commence, tout comme nous montrons un fichier Toast.

Mais le problème est que nous devons spécifier la mise en page parent lors de la création Snackbarcomme ceci:

Snackbar.make(parentlayout, "This is main activity", Snackbar.LENGTH_LONG)
            .setAction("CLOSE", new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            })
            .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
            .show();

Comment donner une mise en page parent lorsque nous montrons Snackbarau début de l'activité sans aucun événement de clic (s'il s'agissait d'un événement de clic, nous aurions pu facilement passer la vue parent)?

Sudheesh Mohan
la source
1
Écrit un article sur onetouchcode.com/2016/12/24/use-snackbar-android-apps , ce sera utile pour connaître plus de détails sur Snackbar
Shailendra

Réponses:

214

Pointez simplement sur n'importe quel Viewcontenu du Activity'sXML. Vous pouvez donner un identifiant au viewGroup racine, par exemple, et utiliser:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);    
   setContentView(R.layout.main_activity);
   View parentLayout = findViewById(android.R.id.content);
   Snackbar.make(parentLayout, "This is main activity", Snackbar.LENGTH_LONG) 
        .setAction("CLOSE", new View.OnClickListener() {
            @Override 
            public void onClick(View view) {

            } 
        }) 
        .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
        .show(); 
   //Other stuff in OnCreate();
}
David Corsalini
la source
58
Pour la vue racine, vous pouvez également généralement utiliser findViewById(android.R.id.content)comme indiqué ici stackoverflow.com/a/4488149/1518546
John Cummings
Afficher parentLayout = findViewById (R.id.root_view); lève une exception nullpointer dans la version 5.0 ou inférieure. Comment résoudre ce problème ?
Anand Savjani
1
@AnandSavjani Le code fonctionne parfaitement avec moi pour la version 5.0 et inférieure à 5.0, il doit y avoir une erreur dans votre mise en page (root_view). Si vous utilisez fragment, vous devez écrire rootview.findViewById (R.id.your_parent_view); Et ne donnez pas non plus le même identifiant que le nom de la mise en page.
Sudheesh Mohan
Je crois que cela lève NullpointerException si vous n'utilisez pas CoordinatorLayout en tant que racine.
Ishaan
N'oubliez pas d'inclure la bibliothèque de conception de support: 'com.android.support:design:27.0.0'
Nikola
27

J'ai eu du mal à afficher Snackbar jusqu'à présent. Voici le moyen le plus simple d'afficher un Snackbar. Pour l'afficher au début de votre activité principale, insérez simplement ces deux lignes dans votreOnCreate()

    Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Welcome To Main Activity", Snackbar.LENGTH_LONG);
    snackbar.show();

PS Assurez-vous simplement que vous avez importé le support de conception Android (comme mentionné dans la question).

Pour Kotlin,

Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT).show()
devDeejay
la source
8

Essaye ça

Snackbar.make(findViewById(android.R.id.content), "Got the Result", Snackbar.LENGTH_LONG)
                        .setAction("Submit", mOnClickListener)
                        .setActionTextColor(Color.RED)
                        .show();
Mohammad
la source
3

appeler cette méthode dans onCreate

Snackbar snack = Snackbar.make(
                    (((Activity) context).findViewById(android.R.id.content)),
                    message + "", Snackbar.LENGTH_SHORT);
snack.setDuration(Snackbar.LENGTH_INDEFINITE);//change Duration as you need
            //snack.setAction(actionButton, new View.OnClickListener());//add your own listener
            View view = snack.getView();
            TextView tv = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_text);
            tv.setTextColor(Color.WHITE);//change textColor

            TextView tvAction = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_action);
            tvAction.setTextSize(16);
            tvAction.setTextColor(Color.WHITE);

            snack.show();
AndroidGeek
la source
2

Une fonction utils pour show snack bar

fun showSnackBar(activity: Activity, message: String, action: String? = null,
    actionListener: View.OnClickListener? = null, duration: Int = Snackbar.LENGTH_SHORT) {
    val snackBar = Snackbar.make(activity.findViewById(android.R.id.content), message, duration)
        .setBackgroundColor(Color.parseColor("#CC000000")) // todo update your color
        .setTextColor(Color.WHITE)
    if (action != null && actionListener!=null) {
        snackBar.setAction(action, actionListener)
    }
    snackBar.show()
}

Exemple d'utilisation dans l'activité

  showSnackBar(this, "No internet")
  showSnackBar(this, "No internet", duration = Snackbar.LENGTH_LONG)
  showSnackBar(activity, "No internet", "OK", View.OnClickListener { 
       // handle click 
  })

Exemple d'utilisation dans Fragment

  showSnackBar(getActivity(), "No internet")

J'espère que ça aide

Phan Van Linh
la source
1

Vous pouvez essayer cette bibliothèque. Ceci est un wrapper pour le snackbar par défaut Android. https://github.com/ChathuraHettiarachchi/CSnackBar

Snackbar.with(this,null)
    .type(Type.SUCCESS)
    .message("Profile updated successfully!")
    .duration(Duration.SHORT)
    .show();

Cela contient plusieurs types de snack-bar et même un snack-bar intégré à vue personnalisée

Chathura Jayanath
la source
1

Cela peut être fait simplement en utilisant les codes suivants dans onCreate. En utilisant la disposition par défaut d'Android

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();
Roches Jarin
la source
sur la version Android 5.x - getWindow().getDecorView()retournez soudainement TOUS l'écran, incluez les `` boutons du bas '' (tels que la maison, le dos, etc.). Donc, ma collation montrait à ce boutons, pas dans l'application
alena_fox_spb
vérifiez la réponse mise à jour. Cela résoudra votre problème. Utiliser la mise en page par défaut d'Android
Jarin Rocks
oui, quand j'ai changé de windowà android.R.id.contenttout commencer à travailler. J'ai donc écrit mon commentaire pour résoudre le problème de quelqu'un d'autre à l'avenir)
alena_fox_spb
0

Vous pouvez également définir une super classe pour toutes vos activités et retrouver la vue une fois dans l'activité parent.

par exemple

AppActivity.java:

public class AppActivity extends AppCompatActivity {

    protected View content;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        changeLanguage("fa");
        content = findViewById(android.R.id.content);
    }
}

et vos collations ressembleraient à ceci dans toutes les activités de votre application:

Snackbar.make(content, "hello every body", Snackbar.LENGTH_SHORT).show();

Il est préférable pour les performances de trouver la vue une fois pour chaque activité.

M.Kasaei
la source