android layout: Tag ini dan turunannya bisa diganti dengan satu <TextView /> dan sebuah drawable gabungan

116

Ketika saya menjalankan layout pada file XML tertentu, saya mendapatkan ini:

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

Perubahan apa yang harus dilakukan untuk kode xml berikut:

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

Seperti inilah tampilannya di layar:

masukkan deskripsi gambar di sini

Ikon kamera adalah defaultnya. Mengklik itu akan memberi pengguna opsi untuk memilih gambar lain.

pdilip.dll
sumber
3
+1, karena situasi ini terlihat lebih kompleks daripada yang dapat ditangani oleh drawable majemuk. Jika Anda belum menerima jawaban Romain, Anda mungkin mendapatkan jawaban yang lebih mendalam.
AlbeyAmakiir

Jawaban:

153

Untuk memperluas jawaban Romain Guy, berikut ini contohnya.

Sebelum:

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

Setelah:

<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" />
NPike
sumber
45
Bagus. Tetapi bagaimana jika saya perlu menyetel properti pada drawable, seperti mendefinisikannya ke 60dip x 60dip?
Kyle Clegg
4
Hei lihat itu, yang harus saya lakukan hanyalah mencari. stackoverflow.com/a/6671544/1224741
QED
@KClegg, Hal ini dimungkinkan dengan perpustakaan khusus. Lihat jawaban saya - stackoverflow.com/a/41347470/2308720
Oleksandr
102

Gabungkan TextViewdan ImageViewmenjadi satu, dengan menggunakan setCompoundDrawable*()metode TextView , atau menggunakan android:drawableLeft.

Romain Guy
sumber
30
Bisakah Anda menunjukkan contoh yang menggambarkan bagaimana hal itu bisa dilakukan? Saya tidak yakin bagaimana semua atribut di ImageView bisa diakomodasi di android: drawableLeft. Terima kasih
pdilip
1
Bagaimana dengan atribut ImageView seperti scaleType?
neteinstein
2
Bagaimana cara menambah jarak antara gambar dan teks?
TharakaNirmana
2
setCompoundDrawable * () tidak berfungsi, gunakan setCompoundDrawablesWithIntrinsicBounds () sebagai gantinya
Kimo_do
1
@Kimo_do, setCompoundDrawable()tidak akan mengurus drawable Anda apa adanya, Anda harus memanggilnya setBounds(lihat API ). Untuk menyetelnya, Anda bisa mendapatkan batas sebelumnya menggunakan TextView.getCompoundDrawables(), mengakses indeks drawable yang benar dan terakhir memanggil getBounds().
Avinash R
3

Terkadang dimungkinkan untuk mengganti ImageView(atau beberapa) dan TextViewdengan satu TextViewdengan drawable majemuk. TIDAK banyak parameter yang dapat diterapkan ke drawable majemuk menggunakan API asli dan pustaka TextViewRichDrawable ini , tetapi jika Anda dapat mengelola satu TextView daripada menggunakan LinearLayout, Anda pasti harus menggunakannya .

Daftar atribut dan parameter yang dapat diterapkan ke sumber daya yang dapat digambar:

Ukuran: ( YA, sungguh ):

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

Bahkan menyetel sumber daya vektor sebagai drawable:

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

Padding Drawable menggunakan native API android:drawablePadding-> link

Berikut ini contohnya:

textView rich drawable

Oleksandr
sumber
2

Sebuah LinearLayoutyang berisi ImageViewdan TextViewdapat lebih efisien ditangani sebagai ditarik senyawa (satu TextView, menggunakan drawableTop, drawableLeft, drawableRight dan / atau drawableBottomatribut untuk menarik satu atau lebih gambar yang berdekatan dengan teks).

Jika kedua widget saling diimbangi dengan margin, ini bisa diganti dengan drawablePaddingatribut.

Ada perbaikan cepat lint untuk melakukan konversi ini di plugin Eclipse.

Dari: Dokumen API Resmi Android!

ilikyar
sumber
2

Tambahkan tools:ignore="UseCompoundDrawables"ke <LinearLayout>.

CoolMind
sumber
1

Saat saya mengikuti kode di atas, teks di dalam TextView tidak disetel dengan benar. Anda perlu mengatur gravitasinya ke pusat | mulai untuk mencapai apa yang ditunjukkan dalam pertanyaan yang diajukan.

Tampilan teksnya terlihat seperti ini:

   <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>
Vikas
sumber
0

Jika Anda tidak ingin mengubah ImageView dan TextView, Anda dapat mengubah versinya di AndroidManifest.xml sebagai:

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

Jika versi Anda adalah android: targetSdkVersion = "17" ubah menjadi "18".

Semoga ini akan diperbaiki. Saya melakukannya dan melakukannya dengan benar

Dunken_sai
sumber
-2

Pendekatan lain adalah menyematkan ViewImage ke LinearLayout lain (izinkan menanganinya dengan id sendiri):

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

Harvey Triana
sumber
Sekarang apa keuntungannya? Dan mengapa Anda menyetel namespace dua kali?
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>
andro_stackoverflow
sumber