2010-07-28 13 views
50

tengo una disposición relativa así:disposición relativa a continuación androide 2 artículos

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

El problema que estoy corriendo en es que quiero que el follow_button a estar por debajo tanto de la page_desc así como la page_image. A veces, el contenido de page_desc tendrá una altura mayor que el tamaño de la imagen, a veces no. el problema es que si configuro el botón siguiente debajo de la imagen o la descripción, entonces el otro quedará recortado. ¿Existe una manera eficiente/efectiva de garantizar que la imagen o page_desc estén siempre visibles y encima del botón?

+0

puede tratar de poner su page_desc y page_image en LinearLayout y el follow_button debajo de LinearLayout? – Sephy

+0

Esperaba evitar eso ya que crea objetos adicionales (y por lo tanto memoria), aunque supongo que si no hay otra opción tendré que hacer eso. – Ben

+0

podría hacer que ambas vistas de texto tengan cierta altura. pero usaría la respuesta @Sephy. Si esto es parte de ListView de algún tipo, se debe reutilizar en su llamada a getView() en su Adaptador. – bgs

Respuesta

44

Aquí van:

<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> 
+10

??? El objetivo de usar RelativeLayout es EVITAR tener que anidar LinearLayouts. :( –

+4

No veo una manera de resolver este caso con un RelativeLayout solamente. No puede definir un elemento que esté por debajo de otros 2 elementos. Publique otra respuesta si puede resolver este problema sin anidar ViewGroups. dice que evitar anidar es el propósito de RelativeLayout? Se puede usar para eso en muchas situaciones, cierto, pero hay excepciones. –

+1

Esperaba una solución más elegante, pero parece que tienes toda la razón. –

2

Ya que todo es interdependiente en el RelativeLayout es irrelevante el orden en que lo coloque en, pero no importa si usted está intentando tener acceso a un punto de vista antes de su creación. Por ejemplo, usar el atributo android: layout_below no es exactamente lo que quería para Button. Si configuras las otras vistas de android: layout_acerca del botón, las vistas siempre estarán encima de él.

<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> 
+0

Alinear al fondo de los padres no es una solución general, pero me gusta más que agregar diseños anidados. –

5

La respuesta aquí requiere muy pocos cambios. Tuviste la mayor parte de tu diseño correcto, sin embargo, hay una opción estropeando todo. AlignParentXXXX a menudo tendrá una prioridad "falsa" sobre sus opciones de LayoutXXXX. Por lo tanto, al configurar su botón para AlignParentBottom, le está diciendo a RelativeLayout que el tamaño del botón no se calcula en el tamaño de diseño principal.

Puede resolver el problema simplemente eliminando AlignParent = "true" de su botón. El código de resultado está debajo y probado. Esta solución se mantiene en línea con tus deseos, creo.

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

me encontré con muchos problemas similares con AlignParent cuando WrapContent estaba en el Padre. El posicionamiento superior e inferior crea un comportamiento no deseado si no está preparado para ello. En general, creo que lo mejor es usar solo uno o el otro (si es que lo hay) y alinear el resto por encima o por debajo.

+0

perdón chicos, quise ofrecer la recompensa en una pregunta diferente. Mis disculpas por la confusión. – Ben

Cuestiones relacionadas