Як показати Snackbar, коли активність починається?


99

Я хочу показати android, Snackbar (android.support.design.widget.Snackbar)коли активність починається так само, як ми показуємо a 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 , це буде корисно знати більше деталей закусочної
Шайлендра

Відповіді:


214

Просто вкажіть на будь-який 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();
}

58
Для кореневого подання ви також можете зазвичай використовувати, 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); А також не вказуйте той самий ідентифікатор, що і назва макета.
Sudheesh Mohan

Я вважаю, що він викидає NullpointerException, якщо ви не використовуєте CoordinatorLayout як корінь.
Ishaan

Не забудьте включити бібліотеку дизайну підтримки: 'com.android.support:design:27.0.0'
Микола

27

Дотепер у мене були проблеми з відображенням 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()

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

2

Функція utils для показу закусочної

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 за замовчуванням
Ярін Рокс,

так, коли я змінився з windowна android.R.id.contentпочати роботу. Тож я написав свій коментар, щоб у майбутньому вирішити іншу проблему з ним)
alena_fox_spb

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

Краще для продуктивності вам доведеться знаходити представлення один раз для кожної діяльності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.