我有这个布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/non_clickable_account_snackbar_constraint_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/my_snackbar_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/my_snackbar_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/show_account_snackbar"
android:theme="@style/Theme.GoogleMaterial.DayNight.Bridge"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
我有一个定制的课程:
public final class MySnackbar<AccountT>
extends BaseTransientBottomBar<MySnackbar<myT>> {
使用
super(findTopMostFrameLayout(parent), content, new MySnackbarAnimation(content));
和
调用"show()"
时,它会显示一个具有自定义布局的android快餐栏。
当我显示my_snackbar
时,它显示在底部导航栏(z轴)下方。
1)如何使其位于导航栏(z轴)的顶部?还是这是常见的行为?
2)您将如何使其从顶部导航到底部导航栏? (y轴)
答案 0 :(得分:1)
您可能正在使用layout fit to system windows。尽管我在您的示例中没有看到它,但这正是它的作用。也许也可以在其他地方设置它。
系统窗口是系统绘制非交互式(对于状态栏而言)还是交互式(对于导航栏而言)内容的屏幕部分。
在大多数情况下,您的应用无需在状态栏或导航栏下绘制,但是如果这样做,则需要确保交互元素(如按钮)没有隐藏在它们的下方。这就是android:fitsSystemWindows =“ true”属性的默认行为:它设置了View的填充,以确保内容不会覆盖系统窗口。
这意味着它还将位于底部的导航栏和顶部的系统栏之下。
对此有一个简单的解决方法。您可以apply window insets。
Chris Banes在该博客中有一些很好的例子。
snackbarCustomLayout.setOnApplyWindowInsetsListener { view, insets ->
view.updatePadding(bottom = insets.systemWindowInsetBottom)
insets
}
请记住,您可能还需要应用左和/或右插图来处理横向模式。
答案 1 :(得分:0)
我认为在elevation
中设置Snackbar
应该可以完成这项工作。
如果您为小吃店使用自定义布局,则可以考虑将android:elevation
放在其上。您也可以通过编程方式进行。
答案 2 :(得分:0)
我认为这会起作用。
Snackbar snb = Snackbar.make(findViewById(targetView), snackMessage, duration);
View view = snb.getView();
view.setBackgroundColor(backgroundColour);
snb.setActionTextColor(textColor);
FrameLayout.LayoutParams params =(FrameLayout.LayoutParams)view.getLayoutParams();
params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
params.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
view.setLayoutParams(params);
答案 3 :(得分:0)
最简单的方法是将AnchorView设置到底部导航抽屉(如果有)。
Snackbar snackbar= Snackbar.make(view, text, duration);
snackbar.setAnchorView(bottomBar);
还请检查您的主题和样式实现。由于主题和样式不正确,也会出现您的问题。
答案 4 :(得分:0)
Snackbar在不同情况下要实现有很多限制,您可以将此库用于相同的SuperToasts
SuperActivityToast.create(context, new Style(), Style.TYPE_BUTTON).setButtonText("Open").setAnimations(Style.ANIMATIONS_POP).show();
答案 5 :(得分:0)
我同意@Knossos,您还可以做一件事,即获得导航栏的高度,并为自定义小吃栏提供边距,或者在导航面板上方的视图内显示小吃栏。
答案 6 :(得分:0)
ViewGroup.MarginLayoutParams视图已停止工作。 要定义自定义边距,您需要在styles.xml中定义自定义Snackbar的样式:
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
//your items
<item name="snackbarStyle">@style/Snackbar</item> //custom snackbar style
</style>
<style name="Snackbar" parent="Widget.MaterialComponents.Snackbar">
<item name="android:layout_margin">@null</item>
<item name="android:layout_marginTop">0dp</item>
<item name="android:layout_marginLeft">0dp</item>
<item name="android:layout_marginRight">0dp</item>
<item name="android:layout_marginBottom">50dp</item> //custom bottom margin
</style>