RelativeLayoutがwrap_contentの全画面表示を取得しています


126

要素がないlayout_height="fill_parent"、つまりすべての要素の高さがwrap_contentであるのに、なぜFOOBARZが一番下までレイアウトされるのですか? ここに画像の説明を入力してください

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/feed_u"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:layout_marginLeft="5dip"
        android:scaleType="centerCrop"
        android:drawableTop="@android:drawable/presence_online"
        android:text="U" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/feed_u">
        <ImageView
            android:id="@+id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_minus" />
        <ImageView
            android:id="@+id/feed_ha"
            android:layout_toLeftOf="@id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_plus" />
        <TextView
            android:id="@+id/feed_t"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Title">
        </TextView>
        <TextView
            android:id="@+id/feed_a"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Band"
            android:layout_below="@id/feed_t">
        </TextView>
        <TextView
            android:id="@+id/feed_s"
            android:layout_below="@id/feed_a"
            android:text="S"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>
        <TextView
            android:id="@+id/feed_tm"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="FOOBARZ"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>

    </RelativeLayout>
</RelativeLayout>

1
使用hierarchyviewer物事がうまく行っている場所を決定するためにEclipseのか、階層ビューの視点:developer.android.com/guide/developing/debugging/...
CommonsWare

Eclipse内の階層ビューのパースペクティブはどこにありますか?どの画面?
hunterp 2011年

1
ウィンドウ>パースペクティブを開く>その他...-@alextcの厚意により、すでに回答は得られていると思います。
CommonsWare 2011年

@CommonsWare見つけましたが、空白です。どうすれば実際にレイアウトをロードできますか?
hunterp 2011年

回答:


266

RelativeLayoutドキュメントから:

クラスの概要

子の位置を相互または親との関係で説明できるレイアウト。

RelativeLayoutのサイズとその子の位置の間に循環依存関係を持つことはできないことに注意してください。たとえば、高さがWRAP_CONTENTに設定されたRelativeLayoutとALIGN_PARENT_BOTTOMに設定された子を持つことはできません。

クラスのドキュメント

それはまさにあなたのケースです。RelativeLayoutはそれを行うことができません。


3
だから私はalign_parentBottomを削除し、レイアウトは本来あるべき画面の1/10になりました、これの下部にFOOBARZをどのように配置できますか?
hunterp 2011年

2
簡単に言うと、FOOBARZテキストビューを取得して、外側のRelativeLayoutに移動し、android:layout_below = "@ id / feed_u"を設定します。これがあなたがタフなものかどうか私は正確にはわかりません。

相対レイアウトに固定の高さを割り当ててみましたか(たとえば、android:layout_height="200dp"これは使用できるようになりますandroid:layout_alignParentBottom="true"
gfrigon

1
これは、大きなドローアブルを背景として使用する場合にも発生する可能性があることに注意してください。それを回避するには、メインコンテンツを子レイアウトに引き出し、背景をその背後にある兄弟<ImageView>にします。
Ben Leggiero、2015年

1
私は子どもたちにも使用することが許可されていないことに気づいたlayout_heightmatch_parent
ダニエル・F

52

これに対する解決策を探している人は、私がしたように、のFrameLayout代わりに使用できますRelativeLayout

次に、目的のオブジェクトの重力を下のように右下に設定できます

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>

FrameLayoutの使用は優れたソリューションです。このレイアウトにさらにコンポーネントがある場合は、オーバーラップを回避するためにマージンを設定する必要があります。
Veronnie、2015年

23

RelativeLayoutを"wrap_content" に、TextViewをandroid:layout_alignParentBottom="true"に設定したので、RelativeLayoutが自動的に一番下までストレッチされます。このような依存関係は、「循環依存関係」としてカウントされる可能性があるため、相対レイアウトでは使用しないでください。

RelativeLayoutのドキュメントから:

RelativeLayoutのサイズとその子の位置の間に循環依存関係を持つことはできないことに注意してください。たとえば、高さが設定されたRelativeLayoutとに設定されWRAP_CONTENTた子を持つことはできませんALIGN_PARENT_BOTTOM

TextViewを親のRelativeLayout以外のものに揃えようとしますが、この問題にも注意してください:
循環依存、正確なコードの助けが必要です

または、より洗練された内部レイアウトを追加してみてください。


2
ちなみに、実行時には、「android:layout_alignParentBottom = "true"」を指定しても、コードは思い通りに表示されると思います。Androidはこの場合、実行時に追加の解析を行い、正しく表示するようです。アプリを実行してみてください。
Dirol 2011年

0

良い答え。layout_alignParentBottom="true"まだこの問題がなく、まだ問題が発生してandroid:background="@drawable/bkgnd"いる場合は、bkgndが重要な場所に注意してください。


0

これを達成するための明確で明白な方法がまだ投稿されていない理由はわかりません。このパフォーマンスの高いソリューションは、既知の高さのビューMyViewで機能します。

FrameLayout RelativeLayoutで高さwrap_contentをラップします。

<!-- width here should constrain RelativeLayout -->
<FrameLayout 
     android:layout_width="@dimen/my_layout_width"
     android:layout_height="wrap_content">

     <RelativeLayout  
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />

     <MyView
        ...
        android:layout_gravity="bottom" />
</FrameLayout>

FrameLayoutの下部にあるビューはRelativeLayoutコンテンツの上部になるため、そのレイアウトの下部にパディングを追加して、それを収容する必要があることに注意してください。そのビューを可変の高さにしたい場合は、FrameLayoutをサブクラス化して、測定されたビューの高さに基づいてコードにパディングを追加するか、パフォーマンスに不安がない場合、つまりリストビューでない場合は、FrameLayoutを垂直のLinearLayoutに変更します。アイテム、またはビューは比較的軽量です。


0

子ビューでalight_Parentタイプのプロパティを使用しないでください

それぞれの重力でRelativeLayoutの代わりにフレームレイアウトを使用できます

    <FrameLayout
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
     <TextView
        android:layout_gravity="bottom|right"
        android:text="Hello "
        android:layout_height="wrap_content"
        android:layout_width="wrap_content">

    </TextView>

</FrameLayout>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.