Как показать Snackbar при запуске Activity?

103

Я хочу показать Android, Snackbar (android.support.design.widget.Snackbar)когда начинается активность, как мы показываем Toast.

Но проблема в том, что мы должны указать родительский макет при создании Snackbarследующим образом:

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

Как предоставить родительский макет, когда мы показываем Snackbarв начале действия без каких-либо событий щелчка (если бы это было событие щелчка, мы могли бы легко передать родительское представление)?

Судиш Мохан
источник
1
Написал статью на onetouchcode.com/2016/12/24/use-snackbar-android-apps , Это будет полезно, чтобы узнать больше подробностей о Snackbar
Шайлендра

Ответы:

221

Просто укажите на любой Viewвнутри Activity'sXML. Например, вы можете присвоить идентификатор корневой группе viewGroup и использовать:

@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();
}
Дэвид Корсалини
источник
59
Для корневого представления вы также обычно можете использовать, findViewById(android.R.id.content)как указано здесь stackoverflow.com/a/4488149/1518546
Джон Каммингс
Просмотр parentLayout = findViewById (R.id.root_view); выдает исключение nullpointer в версии 5.0 или более ранней. Как решить эту проблему ?
Ананд Савджани
1
@AnandSavjani У меня код отлично работает для 5.0 и ниже 5.0, в вашем макете должна быть какая-то ошибка (root_view). Если вы используете фрагмент, вы должны написать rootview.findViewById (R.id.your_parent_view); И также не указывайте тот же идентификатор, что и имя макета.
Судиш Мохан,
Я считаю, что он выдает исключение NullpointerException, если вы не используете CoordinatorLayout в качестве корня.
Ishaan
Не забудьте включить библиотеку поддержки дизайна: com.android.support:design:27.0.0
Никола,
30

До сих пор у меня были проблемы с отображением Snackbar. Вот самый простой способ отобразить Snackbar. Чтобы отобразить его как начало вашей основной деятельности, просто поместите эти две строки в свойOnCreate()

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

PS Просто убедитесь, что вы импортировали поддержку дизайна Android (как указано в вопросе).

Для Котлина,

Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT).show()
devDeejay
источник
8

Попробуй это

Snackbar.make(findViewById(android.R.id.content), "Got the Result", Snackbar.LENGTH_LONG)
                        .setAction("Submit", mOnClickListener)
                        .setActionTextColor(Color.RED)
                        .show();
Мохаммад
источник
3

вызовите этот метод в 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
источник
2

Функция утилит для шоу-закусочной

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

Пример использования в Activity

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

Пример использования во фрагменте

  showSnackBar(getActivity(), "No internet")

Надеюсь, это поможет

Фан Ван Линь
источник
1

Вы можете попробовать эту библиотеку. Это оболочка для снекбара по умолчанию для Android. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Он содержит несколько типов закусочных и даже встроенную закусочную.

Чатура Джаянатх
источник
1

Это можно сделать, просто используя следующие коды внутри onCreate. Используя макет Android по умолчанию

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();
Скалы Ярин
источник
на android версии 5.x - внезапно getWindow().getDecorView()вернуть ВСЕ экран, включить «нижние кнопки» (например, домой, назад и т. д.). Так что моя закуска показывалась на этих кнопках, а не в приложении
alena_fox_spb
проверьте обновленный ответ. Это решит вашу проблему. Использовать макет по умолчанию для Android
Jarin Rocks
да, когда я сменил с windowна android.R.id.contentвсе начну работать. Поэтому я написал свой комментарий, чтобы решить еще
одну
0

Вы также можете определить суперкласс для всех ваших действий и найти представление один раз в родительском действии.

например

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

и ваши закуски будут выглядеть так во всех действиях в вашем приложении:

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

Лучше для производительности вам нужно найти представление один раз для каждого действия.

М.Касаи
источник