Google Ads MediaView неправильно изменяет высоту до wrap_content при отображении изображения

Сегодня я получил электронное письмо от AdMob:

Изменить собственную политику в отношении рекламы. Для нативной рекламы MediaView будет необходим актив видео или основного изображения. В целях упрощения предоставления более качественных рекламных объявлений, начиная с 29 октября, нативная реклама будет требовать MediaView для отображения видео или основного изображения. Рекламные блоки, не соответствующие этой дате, прекратят показ объявлений, что может повлиять на ваш доход от рекламы.

Я попробовал это в своем приложении для Android, удалив отдельную обработку изображений с ImageView и видео с MediaView, но я обнаружил, что MediaView не изменяет высоту представления в соответствии с высотой отображаемого изображения.

В этом примере codelab от Google фиксированная высота и ширина для MediaView используются. Я не могу этого сделать, так как этот экран реагирует на размер экрана, который будет меняться в зависимости от устройства. Тот факт, что размер изображения можно динамически изменять, является одним из основных преимуществ использования UnifiedNativeAds вместо предопределенных объявлений, таких как баннеры.

Вот как я должен отображать MediaView, с помощью match_parent для ширины и wrap_content для высоты.

<com.google.android.gms.ads.formats.MediaView
            android:id="@+id/ad_media"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:adjustViewBounds="true"
            android:scaleType="fitXY"/>

Это то, что я сейчас получаю из приведенного выше кода

Это то, что мне нужно, и ожидаю, что это будет выглядеть при использованииwrap_content

В предыдущем случае, когда мы могли визуализировать изображения отдельно, используя ImageView, wrap_content значение правильного размера изображения.

У кого-нибудь есть обходной путь для этого? Как я могу следовать новым требованиям Google без жесткого кодирования MediaViewвысота?

Мой полный код можно найти здесь, в моем демонстрационном приложении на github.

1 ответ

mediaView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
    @Override
    public void onChildViewAdded(View parent, View child) {
        if (child instanceof ImageView) {
            ImageView imageView = (ImageView) child;
            imageView.setAdjustViewBounds(true);
        }
    }

    @Override
    public void onChildViewRemoved(View parent, View child) {}
});

Я столкнулся с той же проблемой, после многих попыток проб и ошибок я обнаружил, что упаковка <FrameLayout...>(в котором вы добавляете UnifiedNativeAdView) с ScrollView решит эту проблему.

Чтобы все носители были максимально широкими и соответствовали максимальной высоте (чтобы не было никаких сюрпризов в зависимости от размеров носителя).

XML

<com.google.android.gms.ads.formats.MediaView
     android:id="@+id/ad_media"
     android:layout_gravity="center_horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" />

ЯВА

mediaView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
        @Override
        public void onChildViewAdded(View parent, View child) {
            float scale = context.getResources().getDisplayMetrics().density;
            
            int maxHeightPixels = 175;
            int maxHeightDp = (int) (maxHeightPixels * scale + 0.5f);

            if (child instanceof ImageView) { //Images
                ImageView imageView = (ImageView) child;
                imageView.setAdjustViewBounds(true);
                imageView.setMaxHeight(maxHeightDp);

            } else { //Videos
                ViewGroup.LayoutParams params = child.getLayoutParams();
                params.height = maxHeightDp;
                child.setLayoutParams(params);
            }
        }

        @Override
        public void onChildViewRemoved(View parent, View child) {}
    });

При реализации расширенной нативной рекламы используйте свойство imageScaleType для MediaView, как это предлагается здесь, в официальных документах https://developers.google.com/admob/android/native/advanced#setting_imagescaletype.

adView.mediaView.setImageScaleType(ImageView.ScaleType.CENTER_CROP)

или любой другой ScaleType согласно требованиям.

for (int i = 0; i < mediaView.getChildCount(); i++) {
    View view = mediaView.getChildAt(i);
    if (view instanceof ImageView) {
        ((ImageView) view).setAdjustViewBounds(true);
    }
}

Это работает для меня. Я попробовал ответить Ричарда, но он не работал в RecyclerView.

Другие вопросы по тегам