如何将AdView放在ConstraintLayout的底部和下方?

时间:2018-03-06 18:14:52

标签: android android-layout android-relativelayout android-constraintlayout

我正在尝试从RelativeLayout迁移到ConstraintLayout,但我在将AdMob AdView添加到底部以及其上方的其余内容时遇到问题。例如,使用RelativeLayout就是这么简单。您只需将android:layout_alignParentBottom="true"放在AdView上,android:layout_above="@+id/adView"放在包含内容的视图上。

我正在尝试了解如何使用ConstraintLayout而不是RelativeLayout将此示例代码和这两行代码迁移到等效代码。

拜托,有人可以帮我解决这个问题吗?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/adView"/>

    <com.google.android.gms.ads.AdView
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="5dp"
        ads:adSize="BANNER"
        ads:adUnitId="@string/ad_id_banner">
    </com.google.android.gms.ads.AdView>
</RelativeLayout>

我使用app:layout_constraintBottom_toTopOf="@+id/adView"对adView上方的内容和adView上的app:layout_constraintBottom_toBottomOf="parent"进行了测试,但它无法正常工作,因为这些内容并不高于adView背后的内容。此外,adView不会居中。这非常令人沮丧。

1 个答案:

答案 0 :(得分:13)

首先,我想谈谈ConstraintLayout独有的两个行为,当你第一次拿起它时,这些行为不一定是明显的。

match_parent不受支持

此详细信息隐藏在开发人员指南中的一行内容中:https://developer.android.com/training/constraint-layout/index.html

  

注意:您无法将match_parent用于ConstraintLayout中的任何视图。而是使用“匹配约束”(0dp)。

要获得“匹配父级”行为,请将0dp维度与视图的相应边缘的约束结合使用:

android:layout_width="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"

只有在具有相应约束

的情况下才会执行边距

只是添加android:layout_marginTop不会执行任何操作,除非该视图还有一个顶级约束,例如app:layout_constraintTop_toTopOfapp:layout_constraintTop_toBottomOf

您的具体问题

这是更新后的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="5dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/adView"/>

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:adSize="BANNER"
        app:adUnitId="@string/ad_id_banner"/>

</android.support.constraint.ConstraintLayout>

为了实现AdView的水平居中,我们将左右边缘约束到父级的左右边缘。这将AdView从每一侧“拉”出来,使其居中。为了让它粘在屏幕的底部,我们将其底边限制在父节点的底部。

至于LinearLayout,我们首先将其尺寸更改为0dp。这将使约束定义其大小。然后我们将顶部,左侧和右侧边缘约束到父级的顶部,左侧和右侧边缘。我们将底边限制在AdView的上边缘。这会导致它水平填充屏幕,并填充AdView未使用的所有垂直空间。

最后,我们将AdView的上边距更改为LinearLayout的下边距。这是因为LinearLayout的下边缘被约束到AdView的上边缘(但AdView的上边缘不限于LinearLayout' s的下边缘,所以上边距不起作用。)