RelativeLayout está usando a tela cheia para wrap_content


126

Por que FOOBARZ é colocado na parte inferior, quando nenhum elemento está layout_height="fill_parent"em outras palavras, todos os elementos são wrap_content para height? insira a descrição da imagem aqui

<?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
Use hierarchyviewerou a perspectiva Hierarchy View no Eclipse para determinar onde as coisas estão dando errado: developer.android.com/guide/developing/debugging/…
CommonsWare

Onde está a perspectiva da visão da hierarquia dentro do eclipse? qual tela?
hunterp

1
Window> Open Perspective> Other ... - apesar de achar que você já tem sua resposta, cortesia de @alextc.
CommonsWare

@CommonsWare eu encontrei, mas está em branco, como posso realmente carregar um layout nele ??
hunterp

Respostas:


266

Do RelativeLayoutdocumento:

Visão Geral da Classe

Um layout em que as posições dos filhos podem ser descritas em relação umas às outras ou aos pais.

Observe que você não pode ter uma dependência circular entre o tamanho do RelativeLayout e a posição de seus filhos. Por exemplo, você não pode ter um RelativeLayout cuja altura esteja definida como WRAP_CONTENT e um filho definido como ALIGN_PARENT_BOTTOM

Documentação de classe

Qual é exatamente o seu caso. RelativeLayout não pode fazer isso.


3
Então eu removi o align_parentBottom e o layout agora é apenas 1/10 da tela como deveria ser, como posso colocar o FOOBARZ na parte inferior?
Hunterp

2
Apenas dando uma olhada, eu diria: Pegue a visualização de texto FOOBARZ, mova-a para o RelativeLayout externo e defina android: layout_below = "@ id / feed_u". Não tenho muita certeza se é isso que você quer.

Você já tentou atribuir uma altura fixa ao layout relativo (por exemplo, android:layout_height="200dp"isso permitiria que você usasseandroid:layout_alignParentBottom="true"
gfrigon

1
Observe que isso também pode acontecer ao usar um drawable grande como pano de fundo. Para contornar isso, puxe o conteúdo principal para um layout filho e torne o plano de fundo um irmão <ImageView>que está por trás dele.
Ben leggiero

1
Notei que as crianças também não estão autorizadas a usar um layout_heightdosmatch_parent
Daniel F

52

Para quem procura uma solução para isso, como eu, você pode usar em FrameLayoutvez de RelativeLayout.

Em seguida, você pode definir a gravidade do objeto pretendido para o canto inferior direito, como abaixo

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

Use o FrameLayout é uma ótima solução. Se você tiver mais componentes nesse layout, precisará definir a margem para evitar sobreposição.
Veronnie

23

Você definiu o RelativeLayout como "wrap_content" e o TextView como android:layout_alignParentBottom="true", para tentar automaticamente esticar o RelativeLayout para a parte inferior. Não use essas dependências com o Relative Layout, pois pode contar como "dependências circulares".

Dos documentos para RelativeLayout :

Observe que você não pode ter uma dependência circular entre o tamanho do RelativeLayout e a posição de seus filhos. Por exemplo, você não pode ter um RelativeLayout cuja altura esteja definida como WRAP_CONTENTe um filho definido como ALIGN_PARENT_BOTTOM.

Tente alinhar o TextView a algo diferente do RelativeLayout pai, mas observe também este problema:
Dependências circulares, preciso de ajuda com o código exato

Como alternativa, tente adicionar layouts internos mais sofisticados.


2
A propósito, acho que no tempo de execução - seu código seria exibido como você deseja, mesmo com o "android: layout_alignParentBottom =" true "". Parece que o Android faz uma análise adicional neste caso no tempo de execução e o exibe corretamente. Você deve tentar executar seu aplicativo.
Dirol

0

Boas respostas. Agora, se você ainda não tem layout_alignParentBottom="true"esse problema, observe android:background="@drawable/bkgnd"onde o bkgnd é um grande problema.


0

Não sei por que a maneira limpa e óbvia de fazer isso ainda não foi publicada. Essa solução de desempenho funciona para qualquer View MyView com uma altura conhecida.

Envolva o seu RelativeLayoutcom a altura wrap_contentem um 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>

Observe que a visualização na parte inferior do FrameLayout estará na parte superior do seu RelativeLayoutconteúdo; portanto, você precisará adicionar preenchimento à parte inferior desse layout para acomodá-lo. Se você deseja que essa exibição tenha altura variável, é possível incluir a subclasse FrameLayout para adicionar preenchimento no código com base na altura medida da vista, ou simplesmente alterar o FrameLayout para vertical LinearLayout se você não estiver preocupado com o desempenho, ou seja, não é uma lista. item ou as visualizações são relativamente leves.


0

Não use propriedades do tipo alight_Parent com as visualizações filho

Você pode usar o layout do quadro em vez do RelativeLayout com a respectiva gravidade

    <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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.