Как изменить исходное выравнивание Android Snackbar снизу вверх?

Недавняя библиотека Android вышла всего несколько дней назад, но я хотел бы, чтобы SnackBar отображался в верхней части экрана, желательно в RelativeLayout, поскольку это родительский вид.

Как изменить исходное выравнивание SnackBar, которое, как я полагаю, должно быть layout_alignParentBottom, на layout_alignParentTop?


person apollow    schedule 02.06.2015    source источник


Ответы (5)


Можно сделать так, чтобы закусочная отображалась поверх экрана, используя это:

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

Примечание. Анимация для закусочной начинается снизу и поднимается вверх к верхней части экрана, как и ожидалось, потому что согласно ответу ianhanniballake она должна была быть внизу.

Для уведомлений, поступающих сверху, вероятно, было бы лучше вместо этого получить пользовательский баннер.

person apollow    schedule 02.06.2015
comment
вам нужно поставить и другие анимации. in_form_top и out_to_top. проверьте этот stackoverflow.com/a/33333521/1031297 - person OWADVL; 25.10.2015

Нет, согласно спецификации дизайна материалов для закусочных:

Снэк-бары обеспечивают упрощенную обратную связь об операции, отображая краткое сообщение в нижней части экрана.

Поскольку библиотека дизайна стремится реализовать спецификации дизайна материалов, невозможно расположить Snackbar в любом месте, кроме нижней части экрана (или содержащего CoordinatorLayout).

person ianhanniballake    schedule 02.06.2015
comment
Но я показываю это вверху экрана, а это значит, что теперь это возможно. Возможно, это было невозможно в прошлом. - person zeeshan; 24.07.2017
comment
@zeeshan согласно принятому ответу, анимация, связанная с закусочной, предполагает только нижнее позиционирование, потому что это единственное поддерживаемое позиционирование. - person ianhanniballake; 24.07.2017
comment
Не правда. Я могу поставить его куда угодно. На самом деле, я просто переместил его в центр экрана в приложении, над которым работаю, потому что там оно выглядело лучше. Я думаю, что я должен опубликовать правильный ответ, а также сообщить Google, чтобы обновить свою документацию. Часто можно увидеть устаревшую, устаревшую и вводящую в заблуждение информацию в документации Google. - person zeeshan; 24.07.2017
comment
Извините, только то, что вы можете что-то сделать, не означает, что это поддерживается. Как уже упоминалось, анимация предполагает, что он находится на дне своего контейнера. - person ianhanniballake; 24.07.2017
comment
Я не понимаю, что вы пытаетесь намекнуть. Вопрос о позиционировании SnackBar. Любой может это сделать, и полностью поддерживается размещение его в любом месте экрана. - person zeeshan; 24.07.2017
comment
@zeeshan: полностью поддерживается размещение его в любом месте экрана - нет, это не так. Существуют хаки script-kiddie для изменения его положения (например, с принятым ответом), но единственное местоположение, поддерживаемое Google, — это нижняя часть экрана. Эти хаки могут не работать в будущих версиях библиотеки поддержки дизайна. Если Snackbar когда-либо будет поддерживать пользовательское позиционирование, что, ИМХО, маловероятно, будут прямые методы управления позицией, как для Toast. - person CommonsWare; 24.07.2017
comment
Это выходит за рамки этого вопроса, что Google будет поддерживать или нет, или что он делает. Я также не знаю об управлении позиционированием Toast. Я знаю, что его сроки не могут быть изменены. - person zeeshan; 24.07.2017

Вот простой способ добавить SnackBar с помощью CoordinatorLayout в верхней части экрана, но проблема с анимацией все еще остается.

Просто добавьте макет CoordinatorLayout в свой макет, например:

<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>

а затем в своей деятельности получите ссылку на нее и передайте ее в SnackBar, как показано ниже:

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

Кредиты

person Atul O Holic    schedule 16.08.2015

Ну, вы можете получить параметр макета закусочной и изменить в коде значение bottomMargin. нравится

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

Затем вы можете использовать экземпляр закусочной, чтобы показывать, когда захотите.

snackbar.show();
person Cheng    schedule 18.11.2016

Это можно сделать простыми способами

Сначала создайте макет, в который будет включена закусочная.

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

затем в коде

  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);
person yubaraj poudel    schedule 29.06.2015