将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用

Posted

技术标签:

【中文标题】将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用【英文标题】:Match parent for width of ImageView in snackbar with custom view in Android is not working 【发布时间】:2016-10-28 01:28:06 【问题描述】:

我正在开发一个 android 应用程序。在我的应用程序中,我使用带有自定义视图的小吃吧。我的自定义视图只有子视图。那是一个图像视图。显示带有小吃店的自定义视图是可以的。但问题在于快餐栏中 ImageView 的大小。我想将其设置为与父匹配。但是宽度和snackbar的宽度不匹配。

这是我为小吃店定制的视图布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_>

    <ImageView
        android:scaleType="centerCrop"
        android:id="@+id/snackbar_ad_image"
        android:layout_
        android:layout_ />
</LinearLayout>

这就是我在活动中显示小吃店的方式

 private void showSnackbarAd(View view,Ad ad)
    
        final Snackbar snackbar = Snackbar.make(view,"",Snackbar.LENGTH_LONG);
        Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout)snackbar.getView();
        TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text);
        textView.setVisibility(View.INVISIBLE);
        View snackView = getLayoutInflater().inflate(R.layout.snack_bar_ad,null);
        ImageView imageView = (ImageView)snackView.findViewById(R.id.snackbar_ad_image);
        Picasso.with(getBaseContext()).load(ad.getImageUrl()).into(imageView);
        layout.addView(snackView, 0);
        snackbar.show();

我想要的是我想要 ImageView 相同宽度宽度的小吃店。但是我的代码不起作用。

这就是我得到的。

如何使 ImageView 与 Snackbar 具有相同的宽度并适合小吃吧?

【问题讨论】:

您似乎想拉伸图像吧?当你这样做时,有些图像可能看起来很丑。 是的。我想伸展。没关系。合适的图片将从后端上传。因为它是为了广告。请问怎么弄啊? 不确定它是否有效,但尝试将 scaleType 设置为 fitXY 并设置固定高度,因为无论如何,snackbar 的高度应始终为 48 或 80dp。您可以在此处阅读有关 scaleTypes 的更多信息:developer.android.com/reference/android/widget/… android:scaleType="fitXY" 添加到xml中的ImageView 我设置了 firXY。但只要给我同样的结果。 【参考方案1】:

你可以试试这个库。这是 android 默认快餐栏的包装器。 https://github.com/ChathuraHettiarachchi/CSnackBar

Snackbar.with(this,null)
    .type(Type.SUCCESS)
    .message("Profile updated successfully!")
    .duration(Duration.SHORT)
    .show();

或者您甚至可以使用自己的视图,

View view = getLayoutInflater().inflate(R.layout.custom_view, null);

Snackbar.with(this,null)
        .type(Type.UPDATE)
        .contentView(view, 76)
        .duration(Duration.SHORT)
        .show();

【讨论】:

【参考方案2】:

每当使用自定义视图时,请始终避免使用 LinearLayout 作为根元素。它把事情搞砸了,太频繁了。

对于您的问题,尝试将xml中的LinearLayout替换为RelativeLayout。

【讨论】:

【参考方案3】:

您必须在 xml 中指定宽度。所以图像将适合该宽度。 match_parent 属性不会设置宽度,因为没有指定特定的大小。

使用也可以试试下面的代码,

Picasso.with(image.getContext()).load(ad.getImageUrl()).into(new Target() 
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) 
                        image.setImageBitmap(bitmap);
                    

                    @Override
                    public void onBitmapFailed(Drawable errorDrawable) 

                    

                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) 

                    
                );

【讨论】:

ImageView 在我使用这个时完全从小吃店消失了。【参考方案4】:

试试下面的代码,

private void showSnackbarAd(View view,Ad ad) 
        final Snackbar snackbar = Snackbar.make(view,"",Snackbar.LENGTH_LONG);
        Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout)snackbar.getView();

        layout.setPadding(0, 0, 0, 0);//set padding to 0

        TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text);
        textView.setVisibility(View.INVISIBLE);
        View snackView = getLayoutInflater().inflate(R.layout.snack_bar_ad, layout);// use the parent ViewGroup instead of null
        ImageView imageView = (ImageView)snackView.findViewById(R.id.snackbar_ad_image);
        Picasso.with(getBaseContext()).load(ad.getImageUrl()).into(imageView);
        //layout.addView(snackView, 0);
        snackbar.show();

【讨论】:

这段代码给了我 java.lang.***Error 异常。 我刚试过,它在我的设备上完美运行,你能发布堆栈跟踪吗 我可以看看你的xml布局吗? 哦,是的。这是工作。我忘了评论这一行 //layout.addView(snackView, 0)。非常感谢您的支持。

以上是关于将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在启用触摸模式的情况下显示小吃店时,无法将注意力集中在小吃店中的操作按钮上

将 LinearLayout 调整为 ImageView 的宽度

如何调整 ListView 中的 ImageView?

如何在 Espresso 测试中单击快餐栏按钮?

Bootstrap 3 - 如何最大化导航栏中的输入宽度

ImageView的高度与指南的宽度相同