2010-03-16 17 views
6

Görüntünün yanında resim ve metinlerin listesini göstermek için Android 1.5'te bir liste görünümü kullanıyorum. Metni dikey olarak ortalamaya çalışıyorum ancak metin ortalanmış yerine satırın en üstünde.Bir öğeyi göreceli düzeni kullanarak bir listede dikey olarak nasıl hizalarım?

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

O metni dikey ortalamak için deniyorum zaman = "true" alignParentTop ayarlamak gerektiğini garip görünüyor ama bunu yaparsam metin bile görünmüyor değil: Aşağıda benim düzenidir. Neyi yanlış yapıyorum?

cevap

16

DÜZENLEME:

O RelativeLayout ile bu işi yapma çıkıyor kolay değildir. Yanıtın alt kısmında, istenen etkiyi veren bir RelativeLayout ekledim, ancak yalnızca bir ListView'e eklenene kadar. Bundan sonra, soruda açıklanan aynı sorunlar oluştu. Bunun yerine LinearLayout (ler) kullanılarak düzeltildi.

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

Eğer yuva ImageView sonra orientation="vertical" ikinci ve LinearLayout can ve sonra orada metin kutuları koymak, iki metin kutusu olmasını istiyorsanız.

Bu işe yarıyor, ama itiraf etmeliyim ki, RelativeLayouts neden bunu yapmadı bilmiyorum. Örneğin, bu blog post by Romain Guy özellikle RelativeLayout'un gerektiğini belirtiyor. Denediğimde hiç işe yaramadı; itiraf etmeliydim tam olarak yaptığı gibi, ama benim tek değişiklikler, TextViews bazı özellikleri ile vardı, bu bir fark çok şey yapmış olmamalıydı.

Sana RelativeLayout tüm bu biraz çelişkili talimatlar Android'i karıştırıyorsun düşünüyorum:


İşte orijinal bir cevap. Bu konuya şu şekilde yeniden biçimlendirdim:

<?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> 
Ve bu iyi çalışıyor. Yedeklemenizin bir çoğunu kaldırdım, çünkü gerekli olmadı. Bu görünüm şimdi üst sol köşedeki resim ve yanında dikey olarak ortalanmış olan metinle geliyor. Resmin dikey olarak da ortalanmasını istiyorsanız, o zaman RelativeLayout'ın android üzerinde olmasını sağlayamazsınız: layout_height = "wrap_content" çünkü resmin yüksekliğinden daha uzun olmayacaktır. Bir yükseklik belirtmeniz gerekir, ör. 80dp, ve daha sonra uygun bir şekilde sığacak şekilde ölçeklendirmek için ImageView'i android ile 60dp gibi sabit bir yüksekliğe ayarlayın: scaleType = "fitXY".

+0

Denediğiniz için teşekkürler. Düzenin görüntüden daha uzun olmasını istemiyorum, bu yüzden görüntü gayet iyi.Xml'ini denedim ve benim de gördüğüm şeyle aynı şeyi gördüm. TextView'a android: layout_alignParentTop = "true" ekledikçe metin görünmüyor ve tabiki ortalanmış gibi değil. Seninkini bir ListView'in içine koydun mu? –

+0

Hmm. Kendisi bir View iken iyi çalıştı, ancak bir ListView'e eklediğimde, evet, çalışmayı durdurdu. Ben sadece birkaç şey denedim ve hiçbir şey RelativeLayout kullanarak olması gereken şekilde çok çalıştı. Yine de LinearLayout kullanarak aynı efekti elde edebilirsiniz. Yönlendirmeyi yatay olarak ayarlayın ve ardından Text_high yüksekliğini center_vertical yerçekimi ile fill_parent haline getirin. Simgenin yanında birkaç TextView’e sahip olmak istiyorsanız, bunları ikinci bir dikey LinearLayout içine koyabilirsiniz. Bu zarif değil, ama RelativeLayouts neden çalışma değildi neden çalışamam ... –

+0

Cevabınızı LinearLayout bahsetmek için düzenler misiniz? Bu işe yarıyor. –

0

Taban çizgisi yönergesi bunu yapar, ancak ImageView basitçe bugünkü temel hizalamayı desteklemez. ImageView'ın bir alt sınıfını oluşturarak, getBaseline() yöntemini geçersiz kılarak ve görüntünün yüksekliğini döndürerek bu konuda çalışabilirsiniz. yorumların ardından

+0

Teşekkürler, çalışıp çalışmadığını görmek için bu geceyi deneyeceğim. ImageView alt sınıf için bir acı gibi görünüyor ama ben bunu deneyeceğim. –

1

bir süre için benzer bir konuda sıkışmış ancak CommonsWare bu fark edildi:

"Eğer düzenini şişirmek, üst ListView olduğunu inflate(R.layout.whatever, parent, false), kullanıyoruz."

Yalnızca satırın yüksekliğini belirli bir değere ayarladığınızda çalışır (örneğin wrap_content'i kullanamazsınız).