平板电脑上 Snackbar 只显示一半宽度

8

我在平板电脑(API 22)上设置Snackbar时遇到了问题,在手机上(API 23和22)它可以正常工作(从边缘到边缘),即使是横向也没有问题。结果如下所示:enter image description here

FloatingActionButton(支持库)也不会移动(但在手机上会移动)。

我的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/snackParent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_marginBottom="@dimen/margin_fab"
        android:layout_marginRight="@dimen/margin_fab"
        app:pressedTranslationZ="12dp" />
</android.support.design.widget.CoordinatorLayout>

在MainActivity中使用

private void showMessage(String msg) {
    if(snackParent != null) {
        snackbar = Snackbar.make(snackParent, msg, Snackbar.LENGTH_SHORT);
        snackbar.setAction("OK", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                snackbar.dismiss();
            }
        });
        snackbar.show();
    }
}

我只有针对平板电脑 (w820dp) 的其他资源文件,其中包含了尺寸 (fab margin),而 styles 文件夹在手机和平板电脑之间是相同的。我也尝试过无效化Android Studio缓存。

我使用com.android.support:design:23.0.1 targetSdkVersion=23 和compileSdkVersion=23,buildToolsVersion=23.0.1。


我认为这是平板电脑上Snackbar的默认行为。请查看此链接 - Rahul Tiwari
是的,我刚刚在一个空项目上测试了旧的支持库版本、targetSdkVersion等,所有的迹象都表明这是有意为之的。 你能把你的回复发表为答案吗? - Michał Tajchert
这可能有点晚了,但以下内容对我有效:mSnackbar.getView().getLayoutParams().width = AppBarLayout.LayoutParams.MATCH_PARENT; - Smashing
5个回答

8
我认为这是平板电脑上snackbar的默认行为。请查看this

enter image description here


6
你可以随意处理你的消息栏。我们在平板电脑上遇到了同样的问题,我们像下面这样解决了它(例如,以下代码将将消息栏定位在顶部,并使其占据父元素的全部宽度)。
View view = snackbar.getView();

// Position snackbar at top
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams();
params.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
params.width = FrameLayout.LayoutParams.MATCH_PARENT;
view.setLayoutParams(params);

如果我使用上面的视图而不是CoordinatorLayout,我会得到“CoordinatorLayout $ LayoutParams无法转换为android.widget.FrameLayout $ LayoutParams”错误。 - saintjab

1

在深入研究Github代码后,我找到了一个解决方案。您只需要将以下行添加到styles.xml中即可。根据您的要求更改宽度。

<style name="Widget.Design.Snackbar" parent="android:Widget">
    <item name="maxActionInlineWidth">500dp</item>
</style>

如果您想更改Snackbar默认文本视图的行数,可以更改以下样式。
<style name="Widget.MaterialComponents.Snackbar.TextView" parent="Widget.AppCompat.TextView">
    <item name="android:maxLines">3</item>
</style>

0

ViewGroup.LayoutParams layoutParams = snackbarView.getLayoutParams();

获取snackbarView的LayoutParams参数:

        if (layoutParams instanceof FrameLayout.LayoutParams) {
            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) layoutParams;
            params.gravity = Gravity.TOP;
            params.width = FrameLayout.LayoutParams.MATCH_PARENT;
            snackbarView.setLayoutParams(params);
        } else if (layoutParams instanceof CoordinatorLayout.LayoutParams) {
            CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layoutParams;
            params.gravity = Gravity.TOP;
            params.width = FrameLayout.LayoutParams.MATCH_PARENT;
            snackbarView.setLayoutParams(params);
        } else {
            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) layoutParams;
            params.gravity = Gravity.TOP;
            params.width = FrameLayout.LayoutParams.MATCH_PARENT;
            snackbarView.setLayoutParams(params);
        }

-1

我无法通过上述方法解决这个问题。在查看源代码后,我添加了以下代码到我的styles.xml文件中。

<style name="Widget.Design.Snackbar" parent="android:Widget">
    <item name="android:maxWidth">-1px</item>
</style>

目前它被设置为

<item name="android:maxWidth">@dimen/design_snackbar_max_width</item>
<dimen name="design_snackbar_max_width">576dp</dimen>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接