Android-Lint gives me this hint in some cases:
This tag and its children can be replaced by one and a compound drawable
I cou
There is a solution but its not 100% satisfying since you cannot control the size directly only the relative padding with inset:
background.xml
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="4dp"
android:insetTop="4dp"
android:insetLeft="4dp"
android:insetRight="4dp">
<bitmap android:src="@drawable/your_icon"/>
</inset>
layout.xml
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Your text"
android:drawableLeft="@drawable/background"
android:drawablePadding="8dp"
/>
Another solution would ScaleDrawables, but I guess this wont work great over different pixel densities.
I know this answer is a little late but I would recommend using the quickfix: "Add ignore 'UseCompoundDrawables' to element"
This will result in something like:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables" > <!-- This will remove the warning -->
<ImageView
android:layout_width="@dimen/icon_width"
android:layout_height="@dimen/icon_height"
android:contentDescription="@string/item1"
android:src="@drawable/icon1" />
<TextView
android:text="@string/item1"
android:textSize="@dimen/label_font_size" />
</LinearLayout>
Use with caution and lets hope that the API or tools gets "fixed" soon.
Programmatic solution:
You can use drawable.setBounds
but it requires pixels rather than dp as parameters.
how to convert: Converting pixels to dp
code:
Drawable drawable = getDrawable(R.drawable.ic_your_drawable);
int size = dp2px(this, dpSize);
if (drawable != null) {
drawable.setBounds(0, 0, size, size);
}
textView.setCompoundDrawables(drawable, drawable, drawable, drawable);
@Oleksandr answer is the best one especially if your are going to change the Drawable programmatically, but you should add :
@Override
public void setCompoundDrawablesRelativeWithIntrinsicBounds(int start, int top, int end, int bottom) {
super.setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom);
initCompoundDrawableSize();
}
so it will Re-Calculate whenever Coumpounds is changed.
I finally released a library for it:
https://github.com/a-tolstykh/textview-rich-drawable
Use this library to set size of compound drawable.
Original answer
You can add custom attribute to your view to work with size of drawable. Of course, this solution requires additional code, but only once! After you can solve the problem using xml only (only once change the control and use it in all project).
See my example:
TextViewDrawableSize.java
public class TextViewDrawableSize extends TextView { private int mDrawableWidth; private int mDrawableHeight; public TextViewDrawableSize(Context context) { super(context); init(context, null, 0, 0); } public TextViewDrawableSize(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0, 0); } public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr, 0); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context, attrs, defStyleAttr, defStyleRes); } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TextViewDrawableSize, defStyleAttr, defStyleRes); try { mDrawableWidth = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableWidth, -1); mDrawableHeight = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableHeight, -1); } finally { array.recycle(); } if (mDrawableWidth > 0 || mDrawableHeight > 0) { initCompoundDrawableSize(); } } private void initCompoundDrawableSize() { Drawable[] drawables = getCompoundDrawables(); for (Drawable drawable : drawables) { if (drawable == null) { continue; } Rect realBounds = drawable.getBounds(); float scaleFactor = realBounds.height() / (float) realBounds.width(); float drawableWidth = realBounds.width(); float drawableHeight = realBounds.height(); if (mDrawableWidth > 0) { // save scale factor of image if (drawableWidth > mDrawableWidth) { drawableWidth = mDrawableWidth; drawableHeight = drawableWidth * scaleFactor; } } if (mDrawableHeight > 0) { // save scale factor of image if (drawableHeight > mDrawableHeight) { drawableHeight = mDrawableHeight; drawableWidth = drawableHeight / scaleFactor; } } realBounds.right = realBounds.left + Math.round(drawableWidth); realBounds.bottom = realBounds.top + Math.round(drawableHeight); drawable.setBounds(realBounds); } setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]); } }
attrs.xml
<resources>
<declare-styleable name="TextViewDrawableSize">
<attr name="compoundDrawableWidth" format="dimension"/>
<attr name="compoundDrawableHeight" format="dimension"/>
</declare-styleable>
</resources>
And usage
<com.alt.view.TextViewDrawableSize
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/logo"
android:drawableStart="@drawable/logo"
android:drawablePadding="@dimen/space_micro"
app:compoundDrawableHeight="@dimen/small_logo_height"
app:compoundDrawableWidth="@dimen/small_logo_width"
/>
If you scale the images in code as Drawable objects, you can then set them in code using the setCompoundDrawables() method of TextView. This will require having called setBounds() on the Drawables.
As far as I know there is no way to set the size in XML.