Secara terprogram mengatur gambar kiri di TextView

285

Saya memiliki textView di xml di sini.

<TextView
        android:id="@+id/bookTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableLeft="@drawable/checkmark"
        android:gravity="center_vertical"
        android:textStyle="bold"
        android:textSize="24dip"
        android:maxLines="1"
        android:ellipsize="end"/>

Seperti yang Anda lihat, saya mengatur DrawableLeft di xml.

Saya ingin mengubah kode drawable.

Apakah ada cara lain untuk melakukan ini? Atau mengatur drawableLeft dalam kode untuk tampilan teks?

coder_For_Life22
sumber

Jawaban:

781

Anda dapat menggunakan setCompoundDrawablesWithIntrinsicBounds (int kiri, int atas, int kanan, int bawah)

atur 0 di mana Anda tidak ingin gambar

Contoh untuk Drawable di sebelah kiri:

TextView textView = (TextView) findViewById(R.id.myTxtView);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);

Kiat: Setiap kali Anda tahu atribut XML apa pun tetapi tidak memiliki petunjuk tentang cara menggunakannya saat runtime. cukup buka deskripsi properti itu di dokumen pengembang. Di sana Anda akan menemukan Metode Terkait jika didukung saat runtime. yaitu Untuk DrawableLeft

BrainCrash
sumber
Jadi di mana saya mengatur drawable di dalam metode ini?
coder_For_Life22
1
+1 Ini berfungsi untuk mengatur android: drawableLeft untuk TextView secara programatis. Teman Thanx
Paresh Mayani
35
+1 untuk menambahkan tip. yang seharusnya menjadi hal pertama yang diceritakan para
dev
@BrainCrash Anda benar, saya salah mengira dengan metode yang lebih baru yang memiliki nama yang sama.
deathemperor
2
Halo Saya menggunakan metode ini untuk mengatur drawables, tetapi saya tidak dapat menemukan bagian counter pengambilnya. Saya harus memeriksa apakah tampilan teks Compound memiliki beberapa drawable. Bagaimana aku melakukan itu? Mencoba membandingkan textview.getCompoundDrawablesRelative()[0]denganmContext.getResources().getDrawable(R.drawable.my_drawable)
ravi
6

Anda dapat menggunakan salah satu metode berikut untuk mengatur Drawable on TextView:

1- setCompoundDrawablesWithIntrinsicBounds (int, int, int, int)

2- setCompoundDrawables (Left_Drawable, Top_Drawable, Right_Drawable, Bottom_Drawable)

Dan untuk mendapatkan drawable dari sumber yang bisa Anda gunakan:

getResources().getDrawable(R.drawable.your_drawable_id);
Shajeel Afzal
sumber
Tidak, setCompoundDrawablesWithIntrinsicBounds (int, int, int, int) adalah API Levet 3 dari tautan Anda sendiri ...
BrainCrash
1

Menggunakan Kotlin:

Anda dapat membuat fungsi ekstensi atau hanya menggunakan setCompoundDrawablesWithIntrinsicBoundssecara langsung.

fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
   this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}

Jika Anda perlu mengubah ukuran drawable, Anda dapat menggunakan fungsi ekstensi ini.

textView.leftDrawable(R.drawable.my_icon, R.dimen.icon_size)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int) {
    val drawable = ContextCompat.getDrawable(context, id)
    val size = resources.getDimensionPixelSize(sizeRes)
    drawable?.setBounds(0, 0, size, size)
    this.setCompoundDrawables(drawable, null, null, null)
}

Agar benar-benar mewah, buat pembungkus yang memungkinkan modifikasi ukuran dan / atau warna.

textView.leftDrawable(R.drawable.my_icon, colorRes = R.color.white)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int = 0, @ColorInt color: Int = 0, @ColorRes colorRes: Int = 0) {
    val drawable = drawable(id)
    if (sizeRes != 0) {
        val size = resources.getDimensionPixelSize(sizeRes)
        drawable?.setBounds(0, 0, size, size)
    }
    if (color != 0) {
        drawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    } else if (colorRes != 0) {
        val colorInt = ContextCompat.getColor(context, colorRes)
        drawable?.setColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP)
    }
    this.setCompoundDrawables(drawable, null, null, null)
}
Gibolt
sumber
0

Ekstensi Kotlin + beberapa lapisan di sekitar drawable

fun TextView.addDrawable(drawable: Int) {
val imgDrawable = ContextCompat.getDrawable(context, drawable)
compoundDrawablePadding = 32
setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
}
r3dm4n
sumber
0

ada dua cara untuk melakukannya, Anda dapat menggunakan XML atau Java untuk itu. Jika statis dan tidak memerlukan perubahan maka Anda dapat menginisialisasi dalam XML.

  android:drawableLeft="@drawable/cloud_up"
    android:drawablePadding="5sp"

Sekarang jika Anda perlu mengubah ikon secara dinamis maka Anda dapat melakukannya dengan memanggil ikon berdasarkan peristiwa

       textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);
Ayan Bhattacharjee
sumber
-8
static private Drawable **scaleDrawable**(Drawable drawable, int width, int height) {

    int wi = drawable.getIntrinsicWidth();
    int hi = drawable.getIntrinsicHeight();
    int dimDiff = Math.abs(wi - width) - Math.abs(hi - height);
    float scale = (dimDiff > 0) ? width / (float)wi : height /
            (float)hi;
    Rect bounds = new Rect(0, 0, (int)(scale * wi), (int)(scale * hi));
    drawable.setBounds(bounds);
    return drawable;
}
Rashmi P
sumber
Ini tidak menjawab pertanyaan. Diharapkan jawaban terkait TextView.
Rick