web-dev-qa-db-ja.com

android 2つのアイテムの下の相対レイアウト

私はこのような相対的なレイアウトを持っています:

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/single_row"
    Android:padding="12dip">

    <ImageView
        Android:id="@+id/page_image"
        Android:layout_marginRight="6dip"
        Android:layout_width="66dip"
        Android:layout_height="66dip"
        Android:layout_alignParentLeft="true"
        Android:src="@drawable/no_photo" />
    <TextView
        Android:id="@+id/page_name"
        style="@style/Pulse_content"
        Android:layout_alignTop="@id/page_image"
        Android:layout_toRightOf="@id/page_image"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
    <TextView
        Android:id="@+id/page_desc"
        Android:layout_below="@id/page_name"
        style="@style/Pulse_content"
        Android:layout_alignLeft="@id/page_name"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Principal Consultant" />
    <Button
        Android:id="@+id/follow_button"
        Android:layout_below="@id/author_image"
        Android:layout_marginTop="15dip"
        Android:layout_alignParentBottom="true"
        Android:text="Follow"
        style="@style/follow_button" />
</RelativeLayout>

私が直面している問題は、follow_buttonをpage_descとpage_imageの両方の下に配置することです。 page_descコンテンツの高さは画像のサイズよりも大きい場合がありますが、そうでない場合があります。問題は、画像または説明の下にfollow_buttonを設定すると、もう一方がクリップされることです。画像またはpage_descが常に表示され、ボタンの上にあることを保証する効率的/効果的な方法はありますか?

52
Ben

どうぞ:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    Android:background="@drawable/single_row"
    Android:padding="12dip">

    <RelativeLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content">

        <ImageView
            Android:id="@+id/page_image"
            Android:layout_marginRight="6dip"
            Android:layout_width="66dip"
            Android:layout_height="66dip"
            Android:layout_alignParentLeft="true"
            Android:src="@drawable/no_photo" />
        <TextView
            Android:id="@+id/page_name"
            style="@style/Pulse_content"
            Android:layout_alignTop="@id/page_image"
            Android:layout_toRightOf="@id/page_image"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" />
        <TextView
            Android:id="@+id/page_desc"
            Android:layout_below="@id/page_name"
            style="@style/Pulse_content"
            Android:layout_alignLeft="@id/page_name"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Principal Consultant" />
    </RelativeLayout>

    <Button
        Android:id="@+id/follow_button"
        Android:layout_marginTop="15dip"
        Android:text="Follow"
        style="@style/follow_button" />
</LinearLayout>
45

ここでの答えは、ほとんど変更を必要としません。ほとんどのレイアウトは正しいものでしたが、すべてを台無しにするオプションが1つあります。 AlignParentXXXXは、多くの場合、LayoutXXXXオプションよりも「偽」の優先順位を取ります。したがって、ButtonをAlignParentBottomに設定することにより、親レイアウトサイズでボタンのサイズが計算されないことをRelativeLayoutに伝えています。

ButtonからAlignParent = "true"を削除するだけで問題を解決できます。結果コードは以下にあり、テスト済みです。この解決策はあなたの欲求に沿ったものであると信じています。

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/single_row"
    Android:padding="12dip">

    <ImageView
        Android:id="@+id/page_image"
        Android:layout_marginRight="6dip"
        Android:layout_width="66dip"
        Android:layout_height="66dip"
        Android:layout_alignParentLeft="true"
        Android:src="@drawable/no_photo" />
    <TextView
        Android:id="@+id/page_name"
        style="@style/Pulse_content"
        Android:layout_alignTop="@id/page_image"
        Android:layout_toRightOf="@id/page_image"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
    <TextView
        Android:id="@+id/page_desc"
        Android:layout_below="@id/page_name"
        style="@style/Pulse_content"
        Android:layout_alignLeft="@id/page_name"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Principal Consultant" />
    <Button
        Android:id="@+id/follow_button"
        Android:layout_below="@id/author_image"
        Android:layout_marginTop="15dip"
        Android:text="Follow"
        style="@style/follow_button" />
</RelativeLayout>

WrapContentが親にあるときに、AlignParentで多くの同様の問題に遭遇しました。上と下の配置は、準備ができていないと望ましくない動作を引き起こします。一般的に、どちらか一方のみを使用し(あるとしても)、その上または下に残りを並べることが最善であると思います。

6
Fuzzical Logic

RelativeLayoutではすべてが相互に依存しているため、どの順序で配置するかは関係ありませんが、作成する前に1つのビューにアクセスしようとしているかどうかは重要です。たとえば、Android:layout_below属性を使用することは、ボタンに必要なものではありません。他のビューをAndroid:layout_aboveボタンの上に設定すると、ビューは常にその上になります。

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/single_row"
    Android:padding="12dip">

    <Button
        Android:id="@+id/follow_button"
        Android:layout_marginTop="15dip"
        Android:layout_alignParentBottom="true"
        Android:text="Follow"
        style="@style/follow_button" />
    <ImageView
        Android:id="@+id/page_image"
        Android:layout_above="@id/follow_button"
        Android:layout_marginRight="6dip"
        Android:layout_width="66dip"
        Android:layout_height="66dip"
        Android:layout_alignParentLeft="true"
        Android:src="@drawable/no_photo" />
    <TextView
        Android:id="@+id/page_name"
        Android:layout_above="@id/follow_button"
        style="@style/Pulse_content"
        Android:layout_alignTop="@id/page_image"
        Android:layout_toRightOf="@id/page_image"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
    <TextView
        Android:id="@+id/page_desc"
        Android:layout_above="@id/follow_button"
        Android:layout_below="@id/page_name"
        style="@style/Pulse_content"
        Android:layout_alignLeft="@id/page_name"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Principal Consultant" />
</RelativeLayout>
3
HandlerExploit