RelativeLayout, wrap_content için tam ekran alıyor


126

layout_height="fill_parent"Başka bir deyişle, tüm öğeler yüksekliğe göre wrap_content iken FOOBARZ neden en altta yer alıyor ? görüntü açıklamasını buraya girin

<?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İşlerin nerede ters gittiğini belirlemek için Eclipse'deki Hiyerarşi Görünümü perspektifini veya kullanın : developer.android.com/guide/developing/debugging/…
CommonsWare

Tutulmanın içinde hiyerarşi bakış açısı nerede? hangi ekran
hunterp

1
Pencere> Perspektifi Aç> Diğer ... - cevabınızı zaten aldığınızı düşünüyorum, @alextc izniyle.
CommonsWare

@CommonsWare Buldum, ancak boş, içine bir düzeni nasıl yükleyebilirim ??
hunterp

Yanıtlar:


266

Gönderen RelativeLayoutdoc:

Sınıfa Genel Bakış

Çocukların pozisyonlarının birbirlerine veya ebeveyne göre tanımlanabildiği bir Düzen.

RelativeLayout'un boyutu ile alt öğelerinin konumu arasında döngüsel bir bağımlılığa sahip olamayacağınızı unutmayın. Örneğin, yüksekliği WRAP_CONTENT ve bir alt öğesi ALIGN_PARENT_BOTTOM olarak ayarlanmış bir RelativeLayout'a sahip olamazsınız.

Sınıf dokümantasyonu

Bu tam olarak senin davan. RelativeLayout bunu yapamaz.


3
Bu yüzden align_parentBottom öğesini kaldırdım ve düzen şimdi olması gerektiği gibi ekranın sadece 1 / 10'u kadardır, FOOBARZ'ı bunun altına nasıl koyabilirim?
hunterp

2
Sadece kısaca bir göz atarak şunu söyleyebilirim: FOOBARZ textview'u alın, onu dış RelativeLayout'a taşıyın ve android: layout_below = "@ id / feed_u" ayarlayın. Zor istediğinin bu olup olmadığından tam olarak emin değilim.

Göreceli düzene sabit bir yükseklik atamayı denediniz mi (ör android:layout_height="200dp". Bu, kullanmanıza izin verirandroid:layout_alignParentBottom="true"
gfrigon

1
Arka plan olarak büyük bir çekilebilir dosya kullanıldığında da bunun olabileceğini unutmayın. Etrafından dolaşmak için, ana içeriği bir çocuk düzenine çekin ve arka planı <ImageView>arkasındaki kardeş yapın .
Ben Leggiero

1
Ben çocuk da kullanmasına izin verilmez fark layout_heightaitmatch_parent
Daniel F

52

Benim yaptığım gibi buna çözüm arayanlar FrameLayoutyerine kullanabilirsiniz RelativeLayout.

Ardından aşağıdaki gibi yerçekimini istenen nesnenin sağ altına ayarlayabilirsiniz.

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

FrameLayout'u kullanmak harika bir çözümdür. Bu düzende daha fazla bileşene sahipseniz, çakışmayı önlemek için kenar boşluğu ayarlamanız gerekir.
Veronnie

23

RelativeLayout'u "wrap_content" ve TextView'i olarak ayarladınız android:layout_alignParentBottom="true", böylece RelativeLayout'u otomatik olarak aşağıya doğru uzatmaya çalışır. "Döngüsel bağımlılıklar" olarak sayılabileceğinden, Göreceli Düzen ile bu tür bağımlılıkları kullanmayın.

Gönderen RelativeLayout için docs :

RelativeLayout'un boyutu ile alt öğelerinin konumu arasında döngüsel bir bağımlılığa sahip olamayacağınızı unutmayın. Örneğin, yüksekliği olarak ayarlanmış WRAP_CONTENTve alt öğesi olarak ayarlanmış bir RelativeLayout'a sahip olamazsınız ALIGN_PARENT_BOTTOM.

TextView'unuzu ana RelativeLayout dışında bir şeye hizalamaya çalışın, ancak bu soruna da dikkat edin:
Dairesel bağımlılıklar, tam kod için biraz yardıma ihtiyacınız var

Alternatif olarak, daha sofistike iç düzenler eklemeye çalışın.


2
Bu arada, çalışma zamanında, kodunuz "android: layout_alignParentBottom =" true "" ile bile istediğiniz gibi görüntüleneceğini düşünüyorum. Görünüşe göre, Android bu durumda çalışma zamanında ek ayrıştırma yapıyor ve doğru şekilde görüntülüyor. Uygulamanızı çalıştırmayı denemelisiniz.
Dirol

0

Güzel cevaplar. Şimdi eğer yoksa layout_alignParentBottom="true"ve hala bu sorunu android:background="@drawable/bkgnd"alıyorsanız, bkgnd'nin önemli olduğu yere dikkat edin .


0

Bunu başarmanın net ve açık yolunun neden henüz yayınlanmadığından emin değilim. Bu yüksek performanslı çözüm, yüksekliği bilinen herhangi bir View MyView için çalışır.

Boyunuzu bir FrameLayout RelativeLayoutile sarın 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>

Sadece FrameLayout'un altındaki görünümün RelativeLayoutiçeriğinizin üstünde olacağını unutmayın , bu yüzden onu yerleştirmek için o düzenin altına dolgu eklemeniz gerekir. Bu görünümün değişken yükseklik olmasını istiyorsanız, ölçülen görünüm yüksekliğine göre kodda dolgu eklemek için Alt Sınıf FrameLayout'u veya performans konusunda endişelenmiyorsanız FrameLayout'u dikey LinearLayout olarak değiştirebilirsiniz, yani bu bir liste görünümü değildir. öğe veya görünümler nispeten hafiftir.


0

Alight_Parent türü özelliklerini alt görünümlerle kullanmayın

İlgili yerçekimi ile RelativeLayout yerine çerçeve düzenini kullanabilirsiniz.

    <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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.