3

我正在使用原生广告 - 华为文档在 Android 中实现原生广告。当我遇到根据屏幕尺寸(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_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:background="#FFFFFF"
    android:orientation="vertical">
      <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.huawei.hms.ads.nativead.MediaView
                android:id="@+id/ad_media"
                android:layout_width="0dp"
                android:layout_height="0dp"
                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_width="0dp"
                android:layout_height="0dp"
                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 会出现这样的情况:

在此处输入图像描述

我怎样才能解决这个问题?

4

3 回答 3

2

当前小部件自动填充屏幕或屏幕的一部分仅适用于 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”中进行设置。

在此处输入图像描述

比例如下所示:

在此处输入图像描述

于 2021-10-26T05:51:44.120 回答
1

根据我们的分析,如果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_width="wrap_content"
                android:layout_height="wrap_content"
                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"/>
于 2021-10-21T06:10:25.077 回答
1

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

我认为广告提供者会考虑广告的效果并限制材料的大小。正如您发布的上一张图片,空白补充了视频无法达到的高度。

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

在此处输入图像描述

于 2021-10-26T10:07:04.953 回答