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

следуя новому Android snackbar, я пытаюсь установить его на определенную координату y. Это кажется даже невозможным.

Я попытался получить родителя представления snackbar, но для него ничего не нужно делать, чтобы установить его положение.

mSnackBar.getView().getParent();

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

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

2 ответов


возможно установить положение которое Snackbar показано путем располагать 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 в качестве первого аргумента .

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 предоставлена сделать (функция).

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


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

проблема, похоже, была нацелена на родителя, а не на Snackbar.

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