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.