Вызов setCompoundDrawables () не отображает составной Drawable

323

После вызова setCompoundDrawablesметода составной Drawable не отображается ..

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

Есть предположения?

hunterp
источник
9
Как указано в ответах ниже, (..)WithIntrinsicBoundsнеобходимо вызвать вариант названного метода . Кроме того, после этого вызова paddingсоставной Drawable должен быть установлен, чтобы вызвать эффект
Dr1Ku
6
Документ говорит: The должен уже вводимый коэффициент уже были setBounds(Rect)вызван.
привет, охотник, только что встретил тебя в кафе (Ангел), теперь, когда я знаю, что ты знаешь, что такое Drawables для Android (и, возможно, ты ударил память из-за ошибок при работе со многими из них), я могу рассказать тебе о некоторых проекты, с которыми я сотрудничал, должны были решить эту проблему, посмотрите github.com/JakeWharton/DiskLruCache (с которым я сотрудничал, чтобы сделать его более дружественным для Android), который используется Picasso ( github.com/square/picasso )
Gubatron
@ Dr1Ku На самом деле у меня есть раньше и работает в любом случае.
Сотти

Ответы:

629

Мне нужно было использовать setCompoundDrawablesWithIntrinsicBounds.

hunterp
источник
7
нужен API 17, поэтому Drawable.setBounds () может быть лучше
user1324936
6
большое спасибо .. это работает для меня .. могу ли я знать, в чем разница между этими двумя?
AndEngine
1
@ user1324936 «Относительная» версия требует API 17, другие могут использоваться с предыдущими версиями
milosmns
11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds был добавлен в API Уровень 3
Грег Эннис
Я использовал setCompoundDrawableRelativeWithIntrinsicBounds <- этот был добавлен в API 17. Будьте осторожны с intellisense.
Неон Warge
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 .
Курифу
48

Изображение пустое, потому что оно не имеет указанных границ. Вы можете использовать, setCompoundDrawables()но прежде чем вы должны указать границы изображения, используя Drawable.setBounds()метод

Teoretik
источник
1
Лучший ответ, потому что вы на самом деле предоставляете обоснование того, почему setBounds важен.
Энди
@Andy Точно, ненавижу эти топовые ответы с 800 голосами, которые просто скопировали, вставили одну строку кода без слов
Big_Chair
44

Пример установлен наверху:

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

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

Андрей
источник
1
это должен быть принятый ответ, в моем случае используя кнопку. и это работает как ожидалось !!! Это также обратная совместимость.
Мочадви
22

Еще немного проще:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );
Alecs
источник
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)
CoolMind
источник
Для Textview setCompoundDrawablesWithIntrinsicBoundsбудет работать ..
Акаш Бисария
1

Пример с Kotlin:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)
mike.tihonchik
источник
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);

Вот и все.

Асад Али Чоудри
источник