Сопоставление родителя по ширине ImageView в закусочной с пользовательским представлением в Android не работает

Я разрабатываю приложение для Android. В моем приложении я использую закусочную с настраиваемым представлением. Мой пользовательский вид имеет только дочерний вид. Это просмотр изображения. Отображение пользовательского вида с закусочной в порядке. Но проблема с размером ImageView в закусочной. Я хочу, чтобы он соответствовал родителю для with. Но ширина не соответствует ширине закусочной.

Это мой пользовательский макет для закусочной

<?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, и поместиться в закусочную?


person Wai Yan Hein    schedule 25.06.2016    source источник
comment
Кажется, вы хотите растянуть изображение, верно? Некоторые изображения могут выглядеть очень некрасиво, когда вы делаете это.   -  person Clement Osei Tano    schedule 25.06.2016
comment
Да. Я хочу растянуться. Все хорошо. Подходящее изображение будет загружено из бэкенда. Потому что это для рекламы. Пожалуйста, как я могу получить его?   -  person Wai Yan Hein    schedule 25.06.2016
comment
не уверен, что это работает, но попробуйте установить для scaleType значение fitXY и установить фиксированную высоту, так как высота закусочной всегда должна быть 48 или 80 dp. Подробнее о ScaleTypes можно прочитать здесь: developer.android.com/reference/ андроид/виджет/   -  person Katharina    schedule 25.06.2016
comment
Добавьте android:scaleType="fitXY" к ImageView в xml   -  person Vucko    schedule 25.06.2016
comment
Я поставил firXY. Но просто дай мне тот же результат.   -  person Wai Yan Hein    schedule 25.06.2016


Ответы (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();
}
person yummy    schedule 25.06.2016
comment
Этот код дает мне исключение java.lang.StackOverflowError. - person Wai Yan Hein; 25.06.2016
comment
я только что попробовал, он отлично работает на моем устройстве, не могли бы вы опубликовать трассировку стека, пожалуйста - person yummy; 25.06.2016
comment
Могу я увидеть ваш макет xml, пожалуйста? - person Wai Yan Hein; 26.06.2016
comment
О да. Это работает. Я забыл прокомментировать эту строку //layout.addView(snackView, 0). Большое спасибо за вашу поддержку. - person Wai Yan Hein; 26.06.2016

Вы можете попробовать эту библиотеку. Это оболочка для закусочной 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();
person Chathura Jayanath    schedule 02.02.2017

Вам нужно будет указать ширину в 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) {

                    }
                });
person Ashwini    schedule 25.06.2016
comment
ImageView полностью исчезает из закусочной, когда я использовал этот. - person Wai Yan Hein; 25.06.2016

Всякий раз, когда вы используете настраиваемое представление, всегда избегайте использования LinearLayout в качестве корневого элемента. Это портит вещи оооооооооооооооооооооооооооооооооочень часто.

Для вашей проблемы попробуйте заменить LinearLayout в xml на RelativeLayout.

person Kai Wang    schedule 19.07.2016