我正在尝试从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不会居中。这非常令人沮丧。
答案 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_toTopOf
或app: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的下边缘,所以上边距不起作用。)