RelativeLayoutからConstraintLayoutに移行しようとしていますが、AdMob AdViewを下部と上部の残りのコンテンツに追加する際に問題があります。たとえば、RelativeLayoutの使用はとても簡単でした。 AdViewにAndroid:layout_alignParentBottom="true"
を配置し、コンテンツを含むビューにAndroid:layout_above="@+id/adView"
を配置するだけです。
このサンプルコードとこれらの2行のコードを、RelativeLayoutではなくConstraintLayoutを使用して同等のものに移行する方法を理解しようとしています。
誰か、この移行を手伝ってくれる?
<?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>
AdViewの上にあるものにapp:layout_constraintBottom_toTopOf="@+id/adView"
を使用し、adViewにapp:layout_constraintBottom_toBottomOf="parent"
を使用してテストしましたが、背後にあるadViewの上にないため、機能しません。また、adViewは中央に配置されません。それは非常にイライラします。
最初に、ConstraintLayout
に固有の2つの動作についてお話ししたいと思います。これらの動作は、最初に見つけたときに必ずしも明確ではありません。
match_parent
はサポートされていません
この詳細は、開発者ガイドのワンライナーに隠されています: https://developer.Android.com/training/constraint-layout/index.html
注:
ConstraintLayout
のビューにはmatch_parent
を使用できません。代わりに、「一致制約」(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
の下エッジに制限されていません。したがって、上部マージンは効果がありません)。