I\'m updating my current app to use snackbars, in the Google spec they show various ways of using them http://www.google.com/design/spec/components/snackbars-toasts.html#sna
I just add my solution because the @BamsMamx solution's didn't work I need to add getChildAt(0)
public static void displaySnackBarWithBottomMargin(BaseActivity activity, View main) {
Snackbar snackbar = Snackbar.make(main, R.string.register_contacts_snackbar, Snackbar.LENGTH_SHORT);
final FrameLayout snackBarView = (FrameLayout) snackbar.getView();
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) snackBarView.getChildAt(0).getLayoutParams();
params.setMargins(params.leftMargin,
params.topMargin,
params.rightMargin,
params.bottomMargin + 100;
snackBarView.getChildAt(0).setLayoutParams(params);
snackbar.show();
}
Just add it in your theme:
<item name="snackbarStyle">@style/SnackbarMessageStyle</item>
And add the style:
<style name="SnackbarMessageStyle" parent="@style/Widget.MaterialComponents.Snackbar">
<item name="android:layout_margin">@dimen/snackbarMessageMargin</item>
</style>
For kotlin developers, just some handy extension that I use,
inline fun View.snack(message:String, left:Int = 10, top:Int = 10, right:Int = 10, bottom:Int = 10, duration:Int = Snackbar.LENGTH_SHORT){
Snackbar.make(this, message, duration).apply {
val params = CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT )
params.setMargins(left, top, right, bottom)
params.gravity = Gravity.BOTTOM
params.anchorGravity = Gravity.BOTTOM
view.layoutParams = params
show()
}
}
inline fun View.longSnack(message:String){
snack(message, duration = Snackbar.LENGTH_LONG)
}
This works for me
container
is parent tag which is CoordinatorLayout
R.id.bottom_bar
is a view on which above snackbar should be shown
Snackbar.make(container, getString(R.string.copied), Snackbar.LENGTH_LONG).apply {
val params = view.layoutParams as CoordinatorLayout.LayoutParams
params.anchorId = R.id.bottom_bar
params.anchorGravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
view.layoutParams = params
show()
}
if yout want additional margin then simply add padding to R.id.bottom_bar
. This only works
Try this:
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "message", Snackbar.LENGTH_LONG);
View snackBarView = snackbar.getView();
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
params.setMargins(left, top, right, bottom);
snackBarView.setLayoutParams(params);
snackbar.show();
Personally, none of the proposed methods has come up (Android 9)
I decided in the following way.
I added an invisible object (anchor_view) to the layout and made:
snackbar.anchorView = anchor_view