Pergunta

Estou usando uma visualização de lista no Android 1.5 para mostrar uma lista de imagens e texto ao lado da imagem. Estou tentando centralizar verticalmente o texto, mas o texto está na parte superior da linha, em vez de centralizado. Abaixo está o meu layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dip">

    <ImageView android:id="@+id/item_image" android:layout_width="wrap_content" 
        android:layout_height="wrap_content"  android:paddingRight="10dip" 
        android:src="@drawable/default_image" android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"/>

    <TextView android:id="@+id/item_title" 
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
        android:layout_toRightOf="@id/item_image" 
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"
        />

</RelativeLayout>

Parece estranho que eu precise definir alignparenttop = "true" quando estou tentando centralizar verticalmente o texto, mas se eu não aparecer, o texto nem sequer aparece. O que estou fazendo errado?

Foi útil?

Solução

Editar seguindo os comentários:

Acontece que fazer isso funcionar com o RelativeLayout não é fácil. Na parte inferior da resposta, incluí um RelativeLayout que dá o efeito desejado, mas apenas até que esteja incluído em uma ListView. Depois disso, ocorreram os mesmos problemas descritos na pergunta. Isso foi corrigido usando o (s) linearlayout (s).

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:orientation="horizontal">

    <ImageView android:id="@+id/pickImageImage" 
        android:layout_width="100dp"
        android:layout_height="80dp"
        android:background="@drawable/icon"
        android:scaleType="fitXY"
        android:layout_marginRight="10dp"/>

    <TextView android:id="@+id/pickImageText" 
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:gravity="left|center_vertical"
        android:text="I'm the text"/>

</LinearLayout>

Se você quiser ter duas caixas de texto, você pode aninhar um segundo orientation="vertical" e linearlayout após o ImageView e, em seguida, coloque as caixas de texto lá.

Isso funciona, mas tenho que admitir que não sei por que os relativelas não fizeram. Por exemplo, este Postagem do blog por Romain Guy diz especificamente que o relativeLayout deveria. Quando tentei, nunca consegui funcionar bastante; É certo que eu não fiz isso exatamente Como ele fez, mas minhas únicas mudanças foram com alguns atributos das visitas de texto, o que não deveria ter feito muita diferença.


Aqui está a resposta original:

Eu acho que você está confundindo o Android com todas essas instruções um tanto contraditórias na RelativleAyout. Eu reformatei sua coisa para isso:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dip">

    <ImageView android:id="@+id/item_image"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingRight="10dip" 
        android:src="@drawable/icon"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"/>

    <TextView android:id="@+id/item_title" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_toRightOf="@id/item_image" 
        android:layout_centerVertical="true"
        android:text="Blah!"/>

</RelativeLayout>

E isso funciona bem. Eu removi muitos de seus redundantes android:layout_alignParentxxx Porque eles não eram necessários. Essa visualização agora aparece com a imagem no canto superior esquerdo e o texto centrado verticalmente ao lado dela. Se você também deseja centralização verticalmente centrada verticalmente, não pode fazer com que o RelativeLayout esteja no Android: layout_height = "wrap_content" porque está tentando se tornar mais alto que a altura da imagem. Você teria que especificar uma altura, por exemplo, 80dp e depois definir o ImageView como uma altura fixa como 60dp com Android: scaletype = "fitxy" para fazê -lo diminuir para encaixar corretamente.

Outras dicas

Ficou preso em uma questão semelhante por um tempo, mas encontrou isso do Commonsware:

"Quando você inflar o layout, use inflate(R.layout.whatever, parent, false), onde o pai é o ListView. "

Funciona, mas somente quando você define a altura da linha como um valor específico (ou seja, você não pode usar o wrap_content).

A diretiva basal faria isso, mas a ImageView simplesmente não suporta o alinhamento da linha de base até hoje. Você pode contornar isso criando uma subclasse do ImageView, substituir o método getBaseline () e retornar a altura da imagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top