Виклик setCompoundDrawables () не відображає з'єднання Dravable


322

Після того як я викликаю setCompoundDrawablesметод, з'єднання Dravable не відображається.

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

Будь-які думки?


9
Як зазначено у відповідях нижче, (..)WithIntrinsicBoundsпотрібно назвати варіант названого методу . Зі сторони, paddingдля з'єднання Drawable необхідно встановити після цього дзвінка, щоб викликати ефект
Dr1Ku

6
У документі зазначається: «Малюнки», мабуть, вже setBounds(Rect)дзвонили.

привіт, ловере, я щойно познайомився з вами в кафе (Angel), тепер, коли я знаю, що ви знаєте, що таке Android Drawables (і, можливо, ви потрапили в пам'ять із помилок помилок при роботі з багатьма з них), я можу розповісти вам про деякі проекти, з якими я співпрацював, повинні були вирішити цю проблему, ознайомтеся з github.com/JakeWharton/DiskLruCache (який я співпрацював, щоб зробити більш зручним для Android), який використовується Picasso ( github.com/square/picasso )
Gubatron

@ Dr1Ku Насправді я мав це раніше і працює все одно.
Сотті

Відповіді:


629

Мені потрібно було користуватися setCompoundDrawablesWithIntrinsicBounds.


7
потрібно api 17, щоб Dravable.setBounds () міг бути кращим
user1324936

6
дякую дуже .. це працює для мене .. Чи можу я знати, в чому різниця між цими двома?
AndEngine

1
@ user1324936 "Відносна" версія вимагає API 17, інші можна використовувати з попередніми версіями
milosmns

11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds додано в API рівня 3
Грег Енніс

Я використовував setCompoundDravableRelativeWithIntrinsicBounds <- цей додано в API 17. Будьте уважні до інтелігенції.
Неонова війна

69

Використовуйте це (я тестував). Це добре працює

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
Це корисно для націлювання на API нижче 17, оскільки EditText#setCompoundDrawablesWithIntrinsicBoundsпотрібен принаймні API 17.
Krøllebølle,

6
Чи можете ви надати джерело для цього? Вся документація, яку я бачив, свідчить про те, що це доступно з API 1 .
kurifu

48

Зображення порожнє, оскільки не має визначених меж. Ви можете використовувати, setCompoundDrawables()але перед тим, як вказати межі зображення, використовуючи Drawable.setBounds()метод


1
Найкраща відповідь, тому що ви фактично надаєте міркування, чому setBounds важливий.
Енді

@Andy Точно ненавиджу ці найвищі відповіді з 800 голосами, які просто копіюють вставлені один рядок коду без жодних слів
Big_Chair

44

Приклад встановлений вгорі:

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

порядок аргументів: (зліва, вгорі, вправо, внизу)


1
це повинна бути прийнята відповідь, в моєму випадку за допомогою кнопки. і працює так, як очікувалося !!! Це також відстала сумісність.
mochadwi

22

Знову трохи простіше:

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

10

У API 22 воно застаріле.

Цей код корисний для мене:

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

3

У Котліні:

1) Встановити drawable:

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

або

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

2) Встановити TextView:

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

або

button.setCompoundDrawables(null, drawable, null, null)

Для Textview setCompoundDrawablesWithIntrinsicBoundsбуде працювати ..
Акаш Бісарія


1

Приклад з Котліном:

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

0

Зображення не відображається, оскільки ви не вказали межі, тому у вас є 2 варіанти тут.

1-й метод

Використовуйте setCompoundDrawablesWithIntrinsicBoundsметод, як показано нижче

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

2-й метод

Ви можете застосувати межі до малювання перед подачею на TextView, як показано нижче

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

Це воно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.