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


323

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

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

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


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.


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()метод


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

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

Пример с Kotlin:

    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.