Как вы можете настроить Android SnackBar для определенной позиции на экране

Пользуясь новой панелью Android, я пытаюсь установить ее на определенную координату y. Кажется, это даже невозможно.

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

mSnackBar.getView().getParent();

При копании в реальный класс, есть экземпляр mView и mParent, который является закрытым и недоступен в любом случае.

https://developer.android.com/reference/android/support/design/widget/Snackbar.html

5 ответов

Решение

Можно установить местоположение, в котором отображается снэк-бар, расположив android.support.design.widget.CoordinatorLayout в вашем существующем макете деятельности.

Например, скажем, ваш существующий макет RelativeLayout Вы могли бы добавить CoordinatorLayout следующее:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:id="@+id/myCoordinatorLayout"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">
</android.support.design.widget.CoordinatorLayout>

Затем убедитесь, что вы передаете CoordinatorLayout в качестве первого аргумента Snackbar.make() команда.

final View viewPos = findViewById(R.id.myCoordinatorLayout);    
Snackbar.make(viewPos, R.string.snackbar_text, Snackbar.LENGTH_LONG)
                            .setAction(R.string.snackbar_action_undo, showListener)
                            .show();

Это приведет к тому, что Снэк-бар будет показан внизу CoordinatorLayout предоставляется функции make().

Если вы передаете View это не CoordinatorLayout Снэк-бар поднимется вверх по дереву, пока не найдет CoordinatorLayout или корень макета.

Определение макета в явном виде для снэк-бара не всегда может быть практичным.

Проблема, кажется, была нацелена на родителя, а не на закуску.

Snackbar snackbar = Snackbar.make(layout, message, duration);
View snackbarLayout = snackbar.getView();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT, 
    LinearLayout.LayoutParams.WRAP_CONTENT
);
// Layout must match parent layout type
lp.setMargins(50, 0, 0, 0);
// Margins relative to the parent view.
// This would be 50 from the top left.
snackbarLayout.setLayoutParams(lp);
snackbar.show();

У меня есть для вас интересная идея.

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

      Snackbar.make(View,Message , Snackbar.LENGTH_LONG)
.setAnchorView(pb)
.show();

Здесь используется для изменения позиции. Вы можете создать свой макет в файле xml. Просто назовите свой макет внутри setAnchorView и он будет отображаться в позиции макета xml.

Вы можете использовать метод setAnchorView (@IdRes int anchorViewId) закусочной, чтобы установить его над представлением привязки.

https://developer.android.com/reference/com/google/android/material/snackbar/Snackbar#make(android.view.View,%20java.lang.CharSequence,%20int)

В дополнение к BrentM мне пришлось использовать:

androidx.constraintlayout.widget.ConstraintLayout

и добавьте для него зависимость:

implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"

Другие вопросы по тегам