【问题标题】:Match parent for width of ImageView in snackbar with custom view in Android is not working将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用
【发布时间】: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_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:scaleType="centerCrop"
        android:id="@+id/snackbar_ad_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</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。但只要给我同样的结果。

标签: android android-snackbar snackbar


【解决方案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.StackOverflowError 异常。
      • 我刚试过,它在我的设备上完美运行,你能发布堆栈跟踪吗
      • 我可以看看你的xml布局吗?
      • 哦,是的。这是工作。我忘了评论这一行 //layout.addView(snackView, 0)。非常感谢您的支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      相关资源
      最近更新 更多