web-dev-qa-db-ja.com

AdViewをConstraintLayoutの一番下と他のものの下に配置するにはどうすればよいですか?

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は中央に配置されません。それは非常にイライラします。

14

最初に、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_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の下エッジに制限されていません。したがって、上部マージンは効果がありません)。

24
Ben P.