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?


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.


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

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


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)


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

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

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)

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)

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.