原生广告 MediaView 与华为广告实施中的约束不匹配

Posted

技术标签:

【中文标题】原生广告 MediaView 与华为广告实施中的约束不匹配【英文标题】:Native Ads MediaView doesn't match constraint in Huawei Ads Implementation 【发布时间】:2021-12-07 05:34:55 【问题描述】:

我正在使用 Native Ads - Huawei documentation 在 android 中实现原生广告。当我遇到根据 Screen Size (0 dp) 更改 MediaView 的高度时,发现无法更改。

即使我已经实现了 setOnHierarchyChangeListener,但它也不起作用。以下是我目前取得的成果。

文件 native_ad.xml

<com.huawei.hms.ads.nativead.NativeView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/native_video_view"
    android:layout_
    android:layout_
    android:layout_centerInParent="true"
    android:background="#FFFFFF"
    android:orientation="vertical">
      <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        android:layout_>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_
            android:layout_>

            <com.huawei.hms.ads.nativead.MediaView
                android:id="@+id/ad_media"
                android:layout_
                android:layout_
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHeight_percent="0.8"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toTopOf="@id/constraintLayout"/>

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/constraintLayout"
                android:layout_
                android:layout_
                app:layout_constraintHeight_percent="0.2"
                android:background="@drawable/white_bg"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/ad_media">

                <TextView
                    ... />

                <TextView
                    ... />

                <TextView
                  .. />

                <Button
                   ... />

            </androidx.constraintlayout.widget.ConstraintLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

    </com.huawei.hms.ads.nativead.NativeView>

函数inItNativeAdView

private fun initNativeAdView(nativeAd: NativeAd?, nativeView: NativeView) 
    nativeView.titleView = nativeView.findViewById(R.id.ad_title)
    (nativeView.titleView as TextView).text = nativeAd!!.title

    nativeView.mediaView = nativeView.findViewById(R.id.ad_media)
    nativeView.mediaView.setMediaContent(nativeAd.mediaContent)
    nativeView.mediaView.setOnHierarchyChangeListener(object : OnHierarchyChangeListener 
        override fun onChildViewAdded(parent: View, child: View) 
          *//*  if (child is ImageView) 
                val imageView: ImageView = child as ImageView
                imageView.adjustViewBounds = true
            *//*
            val scale = context.resources.displayMetrics.density

            val maxHeightPixels = 175
            val maxHeightDp = (maxHeightPixels * scale + 0.5f).toInt()

            if (child is ImageView)  //Images
                val imageView = child
                imageView.adjustViewBounds = true
                imageView.maxHeight = maxHeightDp
             else  //Videos
                val params = child.layoutParams
                params.height = maxHeightDp
                child.layoutParams = params
            
        

        override fun onChildViewRemoved(parent: View, child: View) 
    )

setOnHierarchyChangeListener 的实现不会改变 mediaView 的高度。

目前我正在查看原生广告如下:

我希望动态 mediaView 有这样的效果:

我该如何解决这个问题?

【问题讨论】:

*//*”是什么意思?它甚至可以编译吗?语法高亮也关闭了。 该代码用 /**/ 注释。我认为你已经编辑了。 【参考方案1】:

当前小部件自动填充屏幕或屏幕的一部分仅适用于 LinearLayout。

在示例 XML 文件中,使用了相对布局。为了使 0dp 加上 layout_weight 控件与 MediaView 一起工作,请在示例代码中的 native_small_template.xml 文件中将布局从 Relative 更改为 Linear如下所示。来自原生广告的图像将相应缩放,如下图所示。

对于使用 ContraintLayout,请根据布局设计使用 app:layout_constraintVertical_weight="1" 或 app:layout_constraintHorizo​​ntal_weight="1" 以使其具有可扩展性。

回答您的进一步问题:

对于视频,最好不要像ttljtw所说的那样改变纵横比。

但可以使用与图像相同的原理来根据视频宽度更改垂直大小。显示宽度可以在初始化过程中设置。通过 layoutParams.width 属性可以使用某个维度的百分比来设置显示宽度。

放大视频宽度示例如下

如果遵循原始示例代码名称,可以在“initNativeAdView”中设置。

此处显示比例:

【讨论】:

我的测试 ID 用于媒体视图中的视频视图,而不是图像视图。这不起作用,因为我需要百分比高度而不是应用程序:layout_constraintVertical_weight="1" 这是媒体视图的结果。请查看ibb.co/thLMv9T。我正在使用 layout_constrainVertical_weight = "1" @waheedshah 更多信息。添加到我的答案中。 我可以根据我的手机宽度减小视频的大小,但使用该脚本缩放视频不起作用。我已经试过了。 @waheedshah 添加了更多信息。昨天,请检查。谢谢【参考方案2】:

根据我们的分析,如果initNativeAdView没有被调用,也会生成广告布局,但是缺少广告内容。随之而来的是 ImageView 在获取广告后没有加载。因此,通过OnHierarchyChangeListener设置高度是不可行的。

但是,您可以直接设置 MediaView 的高度,如下所示:

        MediaView mediaView = nativeView.getMediaView();
        ViewGroup.LayoutParams params = mediaView.getLayoutParams();
        params.height = 200;
        mediaView.setLayoutParams(params);


您可以尝试如下更改 MediaView:

<com.huawei.hms.ads.nativead.MediaView
                android:id="@+id/ad_media"
                android:layout_
                android:layout_
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHeight_percent="0.8"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toTopOf="@id/constraintLayout"/>

【讨论】:

这是行不通的,因为我们必须只为那些应该根据屏幕尺寸匹配约束的视图提供百分比高度。如果我将包装内容放在不起作用的高度。 hi@waheed shah,我更新了我的答案,请参考。 嗨@shirley 感谢您的回复。这是用于 mediaView 中的图像吗?我在媒体视图中使用视频。我也使用了这个 nativeView.mediaView.setImageScaleType(ImageView.ScaleType.FIT_XY) 但这对图像视图没有帮助。 所以这里是链接 ibb.co/4FrHRkT 与 layout_height = 0dp 及以上原生广告类脚本。 对于mediaView中的视频,同样适用,请查看pic。【参考方案3】:

视频的纵横比是固定的。为什么一定要设置超出屏幕宽度的高度?

我认为广告提供商会考虑广告的效果并限制材料的大小。和你发的上一张图一样,留白补充了视频达不到的高度。

或者你可以在Android Studio中使用Layout Inspector,找到视频的布局元素并进行修改。但是,这可能很复杂并且容易出现问题。

【讨论】:

那么解决办法是因为屏幕宽度不能修改高度? 是的,我想是的

以上是关于原生广告 MediaView 与华为广告实施中的约束不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Google Ads MediaView在显示图片时未正确调整高度以适应wrap_content

当我滚动 Recyclerview 时,Admob 原生广告显示空白

广告加载失败,错误代码为 0(内部错误) - 华为广告实施

不要在预览窗口创建线程 - 华为广告实施

Facebook 原生广告未显示,错误“1011 - 显示格式不匹配”

广告调解(admob + FAN)?