RelativeLayout está tomando pantalla completa para wrap_content

126

¿Por qué FOOBARZ se despliega completamente en la parte inferior cuando no hay elementos layout_height="fill_parent"en otras palabras, todos los elementos son wrap_content para altura? ingrese la descripción de la imagen aquí

<?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>
Hunterp
fuente
1
Use hierarchyviewero la perspectiva Vista de jerarquía en Eclipse para determinar dónde van las cosas mal: developer.android.com/guide/developing/debugging/…
CommonsWare
¿Dónde está la perspectiva de la vista de jerarquía dentro del eclipse? cual pantalla?
hunterp
1
Ventana> Perspectiva abierta> Otro ..., aunque creo que ya tiene su respuesta, cortesía de @alextc.
CommonsWare
@CommonsWare Lo he encontrado, pero está en blanco, ¿cómo puedo cargar un diseño en él?
hunterp

Respuestas:

266

Desde el RelativeLayoutdocumento:

Resumen de clase

Un diseño donde se pueden describir las posiciones de los niños en relación entre sí o con los padres.

Tenga en cuenta que no puede tener una dependencia circular entre el tamaño de RelativeLayout y la posición de sus elementos secundarios. Por ejemplo, no puede tener un RelativeLayout cuya altura esté establecida en WRAP_CONTENT y un elemento secundario establecido en ALIGN_PARENT_BOTTOM

Documentación de la clase

Cuál es exactamente tu caso. RelativeLayout no puede hacer eso.

Comunidad
fuente
3
Entonces eliminé align_parentBottom y el diseño ahora es solo 1/10 de la pantalla como debería ser, ¿cómo puedo poner FOOBARZ en la parte inferior de esto?
hunterp
2
Con solo echar un vistazo, diría: tome la vista de texto FOOBARZ, muévala al RelativeLayout externo y configure android: layout_below = "@ id / feed_u". No estoy exactamente seguro de si esto es lo que quieres duro.
¿Ha intentado asignar una altura fija al diseño relativo (por ejemplo, android:layout_height="200dp"esto le permitiría usarandroid:layout_alignParentBottom="true"
gfrigon
1
Tenga en cuenta que esto también puede suceder cuando se usa un dibujo grande como fondo. Para evitarlo, extraiga el contenido principal en un diseño secundario y haga que el fondo sea un hermano <ImageView>que está detrás de él.
Ben Leggiero
1
Me di cuenta de que los niños tampoco están autorizados a utilizar una layout_heightdematch_parent
Daniel F
52

Para aquellos que buscan una solución a esto, como lo hice, puede usar en FrameLayoutlugar deRelativeLayout .

Luego puede establecer la gravedad del objeto deseado en la parte inferior derecha como se muestra a continuación

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>
Muz
fuente
Usar FrameLayout es una gran solución. Si tiene más componentes en este diseño, debe establecer el margen para evitar la superposición.
Veronnie
23

Ha establecido RelativeLayout en "wrap_content" y TextView en android:layout_alignParentBottom="true", por lo que automáticamente intenta estirar RelativeLayout hasta el final. No utilice tales dependencias con diseño relativo, ya que puede contar como "dependencias circulares".

De los documentos para RelativeLayout :

Tenga en cuenta que no puede tener una dependencia circular entre el tamaño de RelativeLayout y la posición de sus elementos secundarios. Por ejemplo, no puede tener un RelativeLayout cuya altura esté establecida en WRAP_CONTENTy un elemento secundario establecido en ALIGN_PARENT_BOTTOM.

Intente alinear su TextView con algo distinto del RelativeLayout principal, pero también tenga cuidado con este problema: las
dependencias circulares, necesitan ayuda con el código exacto

Alternativamente, intente agregar diseños internos más sofisticados.

Dirol
fuente
2
Por cierto, creo que en el tiempo de ejecución: su código se mostrará como desee, incluso con el "android: layout_alignParentBottom =" true "". Parece que Android hace un análisis adicional de este caso en el tiempo de ejecución y lo muestra correctamente. Deberías intentar ejecutar tu aplicación.
Dirol
0

Buenas respuestas Ahora, si no lo ha hecho layout_alignParentBottom="true"y sigue teniendo este problema, tenga cuidado con android:background="@drawable/bkgnd"bkgnd.

Kellogs
fuente
0

No estoy seguro de por qué la forma limpia y obvia de lograr esto aún no se ha publicado. Esta solución eficaz funciona para cualquier View MyView con una altura conocida.

Envuelva su RelativeLayoutaltura wrap_contentcon un 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>

Solo tenga en cuenta que la vista en la parte inferior de FrameLayout estará encima de su RelativeLayoutcontenido, por lo que necesitará agregar relleno al final de ese diseño para acomodarlo. Si desea que la vista sea de altura variable, puede Subclass FrameLayout para agregar relleno en el código basado en la altura de vista medida, o simplemente cambiar FrameLayout a Vertical LinearLayout si no le preocupa el rendimiento, es decir, no es una vista de lista elemento, o las vistas son relativamente ligeras.

Johnny C
fuente
0

No use propiedades de tipo alight_Parent con las vistas secundarias

Puede usar el diseño del marco en lugar de RelativeLayout con la gravedad respectiva

    <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>
Amit Pathak
fuente