Bagaimana cara menggunakan senyawa yang dapat digambar alih-alih LinearLayout yang berisi ImageView dan TextView

198

Jalankan alat Lint baru terhadap kode saya. Itu muncul dengan banyak saran bagus, tetapi yang ini saya tidak mengerti.

Tag ini dan anak-anaknya dapat digantikan oleh label yang dapat digambar

Masalah: Memeriksa apakah node saat ini dapat diganti oleh TextView menggunakan drawable gabungan.

LinearLayout yang berisi ImageView dan TextView dapat lebih efisien ditangani sebagai suatu senyawa yang dapat digambar

Dan di sini adalah tata letak saya

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_centerInParent="true">

<ImageView 
    android:id="@+id/upImage"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_gravity="center_vertical"
    android:scaleType="centerInside"
    android:src="@drawable/up_count_big">
</ImageView>

<TextView
    android:id="@+id/LikeCount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="2dp"
    android:layout_marginBottom="1dp"
    android:textColor="@color/gray"
    android:textSize="16sp"
    android:layout_gravity="center_vertical">
</TextView>
</LinearLayout>

Adakah yang bisa memberikan contoh konkret tentang cara membuat senyawa yang dapat digambar dalam kasus ini?

Leo
sumber
4
fwiw itulah salah satu pemeriksaan yang biasanya saya nonaktifkan, karena positif palsu. Tidak semuaTextView / ImageViewkombo dapat diganti dengan cara ini.
Richard Le Mesurier
@RichardLeMesurier Anda dapat menggunakan tampilan khusus jika Anda ingin menentukan ukuran gambar. Ini akan membuat tampilan Anda lebih ringan. Lihat jawaban saya: stackoverflow.com/a/31916731/2308720
Oleksandr
@Alex Saya setuju dalam banyak kasus, namun dalam pengalaman saya, saya sering tidak sepadan dengan kesulitan membuat tampilan kustom untuk menyiasati apa yang saya anggap sebagai cek Lint yang bermasalah.
Richard Le Mesurier

Jawaban:

258

TextView dilengkapi dengan 4 drawable majemuk, satu untuk masing-masing kiri, atas, kanan dan bawah.

Dalam kasus Anda, Anda tidak perlu LinearLayoutdan ImageViewsama sekali. Tambahkan saja android:drawableLeft="@drawable/up_count_big"ke TextView.

Lihat TextView # setCompoundDrawablesWithIntrinsicBounds untuk info lebih lanjut.

chiuki
sumber
34
belum tentu, karena tautan Anda menunjukkan contoh dengan gambar dinamis. Dalam hal ini mungkin masih lebih mudah atau lebih baik untuk menggunakan ImageView. Peringatan itu mengatakan 'bisa diganti dengan', bukan 'harus diganti dengan'
David O'Meara
9
tapi bagaimana saya bisa membuat jarak antara Gambar dan Teks
Hitesh Dhamshaniya
7
@Hitesh Dhamshaniya, menggunakan properti DrawablePadding dalam XML atau kode.
Snicolas
2
Dalam kasus saya, saya pindah ke LinearLayout dengan ImageView / TextView bagian dalam karena android: drawableLeft tidak menawarkan kontrol yang cukup - jadi, yang pada dasarnya Anda katakan adalah peringatan / saran ini bohong.
BrainSlugs83
5
Ini bukan bohong, untuk beberapa kasus satu TextView memang bisa efisien. Tetapi secara umum - ya, ImageView dengan TextView memberikan kontrol yang lebih kaya.
ılǝ
20

jika karena alasan tertentu Anda perlu menambahkan melalui kode, Anda dapat menggunakan ini:

mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);

di mana kiri, atas, kanan bawah adalah Drawables

Javier P
sumber
Memerlukan API 17 di atas
Puni
Saya kira tidak, dokumentasi menyatakan sejak API 1
Javier P
Lihat tautan ini [dokumentasi] ( developer.android.com/reference/android/widget/… , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
Puni
ya perhatikan Relatif dalam nama metode;) Saya tidak merujuk yang ini dalam jawaban
Javier P
1

Anda dapat menggunakan implementasi drawable compound umum, tetapi jika Anda perlu menentukan ukuran drawable, gunakan perpustakaan ini:

https://github.com/a-tolstykh/textview-rich-drawable

Berikut ini adalah contoh kecil penggunaan:

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