RelativeLayout pobiera pełny ekran dla wrap_content


126

Dlaczego FOOBARZ jest rozłożony na samym dole, gdy nie ma żadnych elementów, layout_height="fill_parent"innymi słowy, wszystkie elementy są zawijane na wysokość? wprowadź opis obrazu tutaj

<?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
Użyj hierarchyviewerlub perspektywy Hierarchy View w Eclipse, aby określić, gdzie sprawy idą nie tak: developer.android.com/guide/developing/debugging/ ...
CommonsWare

Gdzie jest perspektywa widoku hierarchii wewnątrz zaćmienia? który ekran?
hunterp

1
Okno> Otwórz perspektywę> Inne ... - chociaż myślę, że masz już swoją odpowiedź, dzięki uprzejmości @alextc.
CommonsWare

@CommonsWare Znalazłem go, ale jest pusty, jak mogę załadować do niego układ?
hunterp

Odpowiedzi:


266

Z RelativeLayoutdokumentu:

Przegląd klas

Układ, w którym pozycje dzieci można opisać w odniesieniu do siebie nawzajem lub do rodzica.

Należy zauważyć, że nie można mieć cyklicznej zależności między rozmiarem RelativeLayout a pozycją jego elementów podrzędnych. Na przykład nie możesz mieć RelativeLayout, którego wysokość jest ustawiona na WRAP_CONTENT, a element podrzędny ustawiony na ALIGN_PARENT_BOTTOM

Dokumentacja klasowa

Dokładnie tak jest. RelativeLayout nie może tego zrobić.


3
Więc usunąłem align_parentBottom i układ jest teraz tylko 1/10 ekranu, tak jak powinien, jak mogę umieścić FOOBARZ na dole tego?
hunterp

2
Rzucając krótkie spojrzenie, powiedziałbym: weź widok tekstu FOOBARZ, przenieś go do zewnętrznego RelativeLayout i ustaw android: layout_below = "@ id / feed_u". Nie jestem do końca pewien, czy tego chcesz.

Czy próbowałeś przypisać stałą wysokość do względnego układu (np android:layout_height="200dp". Pozwoliłoby ci to użyćandroid:layout_alignParentBottom="true"
gfrigon

1
Zauważ, że może się to również zdarzyć, gdy jako tło używasz dużego rysunku. Aby to obejść, przeciągnij główną zawartość do układu podrzędnego i ustaw tło jako rodzeństwo, <ImageView>które za nią stoi.
Ben Leggiero

1
Zauważyłem, że dzieci też nie wolno używać layout_heightzmatch_parent
Daniel F

52

Dla tych, którzy szukają rozwiązania tego problemu, tak jak ja, możesz użyć FrameLayoutzamiast RelativeLayout.

Następnie możesz ustawić grawitację zamierzonego obiektu na dole po prawej, jak poniżej

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

Skorzystaj z FrameLayout to świetne rozwiązanie. Jeśli masz więcej komponentów w tym układzie, musisz ustawić margines, aby uniknąć nakładania się.
Veronnie

23

Ustawiono RelativeLayout na, "wrap_content" a TextView na android:layout_alignParentBottom="true", więc automatycznie próbuje rozciągnąć RelativeLayout do dołu. Nie używaj takich zależności z układem względnym, ponieważ mogą się one liczyć jako „zależności cykliczne”.

Z dokumentacji RelativeLayout :

Należy zauważyć, że nie można mieć cyklicznej zależności między rozmiarem RelativeLayout a pozycją jego elementów podrzędnych. Na przykład nie można mieć RelativeLayout, którego wysokość jest ustawiona na, WRAP_CONTENTa element podrzędny jest ustawiony na ALIGN_PARENT_BOTTOM.

Spróbuj wyrównać swój TextView do czegoś innego niż nadrzędny RelativeLayout, ale uważaj również na ten problem:
Zależności cykliczne, potrzebuję pomocy z dokładnym kodem

Alternatywnie spróbuj dodać bardziej wyrafinowane układy wewnętrzne.


2
Nawiasem mówiąc, myślę, że w czasie wykonywania - twój kod byłby wyświetlany tak, jak chcesz, nawet z "android: layout_alignParentBottom =" true "". Wygląda na to, że Android wykonuje dodatkowe analizy tego przypadku w czasie wykonywania i wyświetla go poprawnie. Powinieneś spróbować uruchomić aplikację.
Dirol

0

Dobre odpowiedzi. Teraz, jeśli nie masz layout_alignParentBottom="true"i nadal masz ten problem, uważaj na to, android:background="@drawable/bkgnd"gdzie bkgnd jest biggie.


0

Nie jestem pewien, dlaczego czysty i oczywisty sposób osiągnięcia tego nie został jeszcze opublikowany. To wydajne rozwiązanie działa dla każdego widoku MyView o znanej wysokości.

Owiń swoją RelativeLayoutwysokość wrap_contentw FrameLayout:

<!-- 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>

Zwróć uwagę, że widok na dole FrameLayout będzie nad RelativeLayouttreścią, więc musisz dodać dopełnienie u dołu tego układu, aby go pomieścić. Jeśli chcesz, aby ten widok miał zmienną wysokość, możesz albo podklasę FrameLayout, aby dodać dopełnienie w kodzie na podstawie zmierzonej wysokości widoku, lub po prostu zmienić FrameLayout na pionowy LinearLayout, jeśli nie martwisz się o wydajność, tj. Nie jest to widok listy element lub widoki są stosunkowo lekkie.


0

Nie używaj właściwości typu alight_Parent z widokami podrzędnymi

Możesz użyć układu ramki zamiast RelativeLayout z odpowiednią grawitacją

    <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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.