android düzeni: Bu etiket ve alt öğeleri, bir <TextView /> ve bir bileşik çekilebilir


116

Düzeni belirli bir XML dosyasında çalıştırdığımda, şunu alıyorum:

 This tag and its children can be replaced by one <TextView/> 
and a compound drawable

Aşağıdaki xml kodu için ne değişiklik yapılmalıdır:

<LinearLayout android:id="@+id/name_layout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:background="@drawable/grouplist_single_left_grey_area" >
                <ImageView android:id="@+id/photo_image"
                    android:layout_width="@dimen/thumbnail_width"
                    android:layout_height="@dimen/thumbnail_height"
                    android:paddingBottom="5dip"
                    android:paddingTop="5dip"
                    android:paddingRight="5dip"
                    android:paddingLeft="5dip"
                    android:layout_marginRight="5dip"
                    android:clickable="true"
                    android:focusable="true"
                    android:scaleType="fitCenter"
                    android:src="@*android:drawable/nopicture_thumbnail"
                    android:background="@drawable/photo_highlight" />
                <TextView android:id="@+id/name"
                    android:paddingLeft="5dip"
                    android:layout_weight="1"
                    android:layout_width="0dip"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
            </LinearLayout>

Ekranda şu şekilde görünüyor:

görüntü açıklamasını buraya girin

Kamera simgesi varsayılandır. Buna tıklamak, kullanıcıya başka bir resim seçme seçeneği sunacaktır.


3
+1, çünkü bu durum, bileşik çekmeceyle ele alınabileceğinden daha karmaşık görünüyor. Romain'in cevabını kabul etmemiş olsaydınız, daha derinlemesine bir cevap almış olabilirsiniz.
AlbeyAmakiir

Yanıtlar:


153

Romain Guy'ın cevabını genişletmek için işte bir örnek.

Önce:

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:layout_marginTop="10dp"  
android:padding="5dp" >

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="My Compound Button" />

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_drawable" />
</LinearLayout>

Sonra:

<TextView  
    android:layout_marginTop="10dp"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="My Compound Button" 
    android:drawableRight="@drawable/my_drawable" android:padding="5dp" />

45
Şık. Peki ya çekilebilir öğenin özelliklerini 60dip x 60dip olarak tanımlamam gerekirse?
Kyle Clegg

4
Hey şuna bak, tek yapmam gereken aramaktı. stackoverflow.com/a/6671544/1224741
QED

@KyleClegg, Özel bir kütüphane ile mümkündür. Cevabımı görün - stackoverflow.com/a/41347470/2308720
Oleksandr

102

Birleştirme TextViewve ImageViewTextView'un en kullanarak, birine setCompoundDrawable*()yöntemler kullanılarak veya android:drawableLeft.


30
Beni bunun nasıl yapılabileceğini gösteren bir örneğe yönlendirebilir misiniz? ImageView'daki tüm özniteliklerin android: drawableLeft'e nasıl yerleştirilebileceğinden emin değilim. Teşekkür ederim
pdilip

1
ScaleType gibi ImageViews özellikleri ne olacak?
neteinstein

2
Resim ile metin arasındaki boşluğu nasıl artırabilirim?
TharakaNirmana

2
setCompoundDrawable * () çalışmıyor, bunun yerine setCompoundDrawablesWithIntrinsicBounds () kullanın
Kimo_do

1
@Kimo_do, setCompoundDrawable()çekilebilirliğinize olduğu gibi bakmaz, onu çağırmanız setBoundsgerekir ( API'ye bakın ). Bunu ayarlamak için, TextView.getCompoundDrawables()doğru çekilebilir dizine erişerek ve son olarak çağırarak önceki sınırları elde edebilirsiniz getBounds().
Avinash R


3

Bazen değiştirmek mümkündür ImageView(veya birden fazla) ve TextViewbir ile TextViewbileşim çekilebilir (ler) ile yıkanmıştır. Yerel API ve bu TextViewRichDrawable kitaplığı kullanılarak bileşik çekilebilirliğe uygulanabilecek çok fazla parametre YOKTUR , ancak LinearLayout kullanmak yerine bir TextView'ı yönetebiliyorsanız, kesinlikle onu kullanmalısınız .

Bileşik çekilebilir öğelere uygulanabilecek niteliklerin ve parametrelerin listesi:

Boyut: ( EVET, gerçekten ):

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:compoundDrawableHeight="24dp"
    app:compoundDrawableWidth="24dp"/>

Vektör kaynağını bile çekilebilir olarak ayarlayın :

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:drawableTopVector="@drawable/some_vector_drawble"
    app:drawableEndVector="@drawable/another_vector_drawable" />

Yerel API kullanarak Drawable'ın Dolgusu android:drawablePadding-> bağlantı

İşte bir örnek:

textView zengin çekilebilir


2

Bir LinearLayoutiçeren bir ImageViewve TextViewdaha etkili bir şekilde bileşik çekilebilir olarak ele alınabilir: (a tek TextViewkullanarak drawableTop, drawableLeft, drawableRight ve / veya drawableBottombir veya daha fazla görüntü metin bitişik çekmek için özellikleri).

İki widget birbirinden kenar boşluklarıyla kaymışsa, bu bir drawablePaddingöznitelikle değiştirilebilir .

Eclipse eklentisinde bu dönüşümü gerçekleştirmek için küçük bir hızlı düzeltme var.

Gönderen: Android Resmi API belgeleri!


2

Ekle tools:ignore="UseCompoundDrawables"için <LinearLayout>.


1

Yukarıdaki kodu takip ettiğimde, TextView içindeki metin düzgün ayarlanmıyor. Sorulan soruda gösterileni elde etmek için yerçekimini merkeze ayarlamanız gerekir.

Metin görünümü şuna benzer:

   <TextView
        android:id="@+id/export_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawableLeft="@drawable/up_arrow"
        android:drawableStart="@drawable/up_arrow"
        android:gravity="center|start"
        android:text="....."
        android:textSize="@dimen/font_size15" >
    </TextView>

0

ImageView ve TextView'ı değiştirmek istemiyorsanız, AndroidManifest.xml'deki sürümü şu şekilde değiştirebilirsiniz:

    <uses-sdk`
    android:minSdkVersion="8"
    android:targetSdkVersion="18" 
    />

Sürümünüz android ise: targetSdkVersion = "17", "18" olarak değiştirin.

Umarım bu düzelir. Yaptım ve doğru anladım


-2

Başka bir yaklaşım, ViewImage'ı başka bir LinearLayout içine yerleştirmektir (tek başına id ile işlemeye izin verin):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/blue_3"
            android:layout_gravity="center_horizontal"
            android:paddingTop="16dp" />
    </LinearLayout>
    <TextView 
        android:id="@+id/tvPrompt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:paddingTop="16dp"
        android:text="@string/xy" />


Şimdi bunun avantajı ne olabilir? Ve neden ad alanını iki kez ayarlıyorsunuz?
ygesher

-5
    This tag and its children can be replaced by one <TextView/> and a compound drawable



    <?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:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:contentDescription="."
        android:padding="3dp" 
        android:src="@drawable/tab_home_btn">
    </ImageView>

    <TextView
        android:id="@+id/textview"       
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="首页"
        android:textSize="10sp"
        android:textColor="#ffffff">
    </TextView>

</LinearLayout>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.