Memanggil setCompoundDrawables () tidak menampilkan Compound Drawable

323

Setelah saya memanggil setCompoundDrawablesmetode, senyawa Drawable tidak ditampilkan ..

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

Adakah pikiran?

hunterp
sumber
9
Seperti yang dinyatakan dalam jawaban di bawah ini, varian dari metode yang dinamai (..)WithIntrinsicBoundsperlu dipanggil. Di samping catatan, paddinguntuk Drawable Compound harus ditetapkan setelah panggilan ini untuk menimbulkan efek
Dr1Ku
6
The Dokumen mengatakan: The digambar sudah pasti telah setBounds(Rect)disebut.
hai hunterp, baru saja bertemu dengan Anda di coffee shop (Angel), sekarang saya tahu Anda tahu apa itu Drawables Android (dan mungkin Anda memiliki ingatan karena kesalahan saat bekerja dengan banyak dari mereka), saya dapat memberitahu Anda tentang beberapa proyek-proyek yang telah saya kolaborasi harus mengatasi masalah ini, lihat github.com/JakeWharton/DiskLruCache (yang saya berkolaborasi untuk membuat android lebih ramah) yang digunakan oleh Picasso ( github.com/square/picasso )
Gubatron
@ Dr1Ku Sebenarnya saya sudah memilikinya sebelumnya dan masih berfungsi.
Sotti

Jawaban:

629

Saya harus menggunakan setCompoundDrawablesWithIntrinsicBounds.

hunterp
sumber
7
membutuhkan api 17 sehingga Drawable.setBounds () mungkin lebih baik
user1324936
6
terima kasih banyak .. ini bekerja untuk saya .. mungkin saya tahu apa perbedaan antara keduanya?
AndEngine
1
@ user1324936 Versi 'relatif' membutuhkan API 17, yang lain dapat digunakan dengan versi sebelumnya
milosmns
11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds ditambahkan di API Level 3
Greg Ennis
Saya menggunakan setCompoundDrawableRelativeWithIntrinsicBounds <- yang ini ditambahkan pada API 17. Hati-hati dengan intellisense.
Neon Warge
69

Gunakan ini (saya diuji). Itu bekerja dengan baik

Drawable image = context.getResources().getDrawable( R.drawable.ic_action );
int h = image.getIntrinsicHeight(); 
int w = image.getIntrinsicWidth();   
image.setBounds( 0, 0, w, h );
button.setCompoundDrawables( image, null, null, null );
aryan bahmani
sumber
1
Ini berguna ketika menargetkan API lebih rendah dari 17, karena EditText#setCompoundDrawablesWithIntrinsicBoundsmembutuhkan setidaknya API 17.
Krøllebølle
6
Bisakah Anda memberikan sumber untuk itu? Semua dokumentasi yang saya lihat menunjukkan ini sudah tersedia sejak API 1 .
kurifu
48

Gambar kosong karena tidak memiliki batas yang ditentukan. Anda dapat menggunakan setCompoundDrawables()tetapi sebelum Anda harus menentukan batas gambar, menggunakan Drawable.setBounds()metode

teoREtik
sumber
1
Jawaban terbaik karena Anda benar-benar memberikan alasan mengapa setBounds penting.
Andy
@Andy Tepat, benci jawaban teratas ini dengan 800 suara yang hanya menyalin satu baris kode yang disisipkan tanpa kata
Big_Chair
44

Contoh diatur ke atas:

view.setCompoundDrawablesWithIntrinsicBounds(
    null,
    getResources().getDrawable(R.drawable.some_img),
    null,
    null
);

urutan argumen: (kiri, atas, kanan, bawah)

Andrey
sumber
1
ini harus menjadi jawaban yang diterima, dalam kasus saya menggunakan tombol. dan itu berfungsi seperti yang diharapkan !!! Ini juga kompatibilitas ke belakang.
mochadwi
22

Sedikit lebih sederhana lagi:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );
Alecs
sumber
10

Itu ditinggalkan dalam API 22.

Kode ini bermanfaat bagi saya:

Drawable drawable = ResourcesCompat.getDrawable(getResources(),R.drawable.wen, null);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),
drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable, null, null, null);
許維德
sumber
3

Di Kotlin:

1) Set drawable:

val drawable = ContextCompat.getDrawable(context!!,R.drawable.ic_image)?.apply {
    setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}

atau

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2) Set TextView:

textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

atau

button.setCompoundDrawables(null, drawable, null, null)
CoolMind
sumber
Untuk Textview setCompoundDrawablesWithIntrinsicBoundsakan bekerja ..
Akash Bisariya
1

Contoh dengan Kotlin:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)
mike.tihonchik
sumber
0

Gambar tidak ditampilkan karena Anda tidak menentukan batas, jadi Anda memiliki 2 opsi di sini.

Metode 1

Gunakan setCompoundDrawablesWithIntrinsicBoundsmetode, seperti yang ditunjukkan di bawah ini

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn. setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null);

Metode 2

Anda dapat menerapkan batas pada drawable sebelum menerapkan ke TextView, seperti yang ditunjukkan di bawah ini

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
myDrawable.setBounds( 0, 0, myDrawable.getIntrinsicWidth(), myDrawable.getIntrinsicHeight());
btn.setCompoundDrawables(myDrawable, null, null, null);

Itu dia.

Asad Ali Choudhry
sumber