¿Cómo mostrar Snackbar cuando comienza la actividad?


99

Quiero mostrar a Android Snackbar (android.support.design.widget.Snackbar)cuando comienza la actividad, tal como mostramos a Toast.

Pero el problema es que tenemos que especificar el diseño principal al crear Snackbarasí:

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();

¿Cómo dar un diseño principal cuando mostramos Snackbaral inicio de la actividad sin ningún evento de clic (si fuera un evento de clic, podríamos haber pasado fácilmente la vista principal)?


1
Escribí un artículo en onetouchcode.com/2016/12/24/use-snackbar-android-apps , esto será útil para conocer más detalles de Snackbar
Shailendra

Respuestas:


214

Simplemente apunte a cualquiera Viewdentro del Activity'sXML. Puede dar una identificación al viewGroup raíz, por ejemplo, y usar:

@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();
}

58
Para la vista raíz, generalmente también puede usar findViewById(android.R.id.content)como se indica aquí stackoverflow.com/a/4488149/1518546
John Cummings

Ver parentLayout = findViewById (R.id.root_view); arroja una excepción de puntero nulo en la versión 5.0 o inferior. Cómo resolver este problema ?
Anand Savjani

1
@AnandSavjani El código funciona perfectamente conmigo para 5.0 y por debajo de 5.0, debe haber algún error en su diseño (root_view). Si está utilizando un fragmento, debe escribir rootview.findViewById (R.id.your_parent_view); Y tampoco dé la misma identificación que el nombre del diseño.
Sudheesh Mohan

Creo que arroja NullpointerException si no está utilizando CoordinatorLayout como raíz.
Ishaan

No olvide incluir la biblioteca de diseño de soporte: 'com.android.support:design:27.0.0'
Nikola

27

He tenido problemas para mostrar Snackbar hasta ahora. Esta es la forma más sencilla de mostrar una barra de aperitivos. Para mostrarlo como inicio de su actividad principal, simplemente coloque estas dos líneas dentro de suOnCreate()

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

PD: Solo asegúrate de haber importado el soporte de diseño de Android (como se menciona en la pregunta).

Para Kotlin,

Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT).show()

8

Prueba esto

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

3

llamar a este método en 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();

2

Una función util para 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()
}

Ejemplo usando en Actividad

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

Ejemplo usando en Fragmento

  showSnackBar(getActivity(), "No internet")

Espero que ayude


1

Puedes probar esta biblioteca. Este es un contenedor para la barra de aperitivos predeterminada de Android. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Contiene varios tipos de snackbar e incluso un snackbar integrado con vista personalizada


1

Se puede hacer simplemente usando los siguientes códigos dentro de onCreate. Usando el diseño predeterminado de Android

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();

en la versión de Android 5.x: getWindow().getDecorView()devuelve repentinamente TODA la pantalla, incluye 'botones inferiores' (como inicio, atrás, etc.) Así que mi bocadillo se mostraba en estos botones, no en la aplicación
alena_fox_spb

verifique la respuesta actualizada. Resolverá tu problema. Usar el diseño predeterminado de Android
Jarin Rocks

sí, cuando me cambié de windowa android.R.id.contenttodos empecé a trabajar. Así que escribí mi comentario para resolver el problema de alguien más con él en el futuro)
alena_fox_spb

0

También puede definir una superclase para todas sus actividades y buscar la vista una vez en la actividad principal.

por ejemplo

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);
    }
}

y sus bocadillos se verían así en todas las actividades de su aplicación:

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

Es mejor para el rendimiento que tenga que buscar la vista una vez para cada actividad.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.