I'm having a weird problem with TypedArray.getDrawable() in one of my custom Views. For simplicity's sake, here's a trivial test project that displays the same problem:
TestView.java
package com.example.testing;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
public class TestView extends View {
    private Drawable mDrawable;
    public TestView(Context context) {
        this(context, null);
    }
    public TestView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public TestView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TestView, defStyle, 0);
        try {
            Drawable d = a.getDrawable(R.styleable.TestView_testDrawable);
            if (d != null) {
                setDrawable(d);
            }
        } finally {
            a.recycle();
        }
    }
    private void setDrawable(Drawable d) {
        mDrawable = d;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mDrawable != null) {
            mDrawable.draw(canvas);
        }
    }
}
res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>    
    <declare-styleable name="TestView">
        <attr name="testDrawable" format="reference|color" />
    </declare-styleable>
</resources>
res/layout/main_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:custom="http://schemas.android.com/apk/res/com.example.testing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
     <com.example.testing.TestView
         android:id="@+id/testView1"
         android:layout_width="match_parent"
         android:layout_height="100dp"
         custom:testDrawable="#ff0099" />
</LinearLayout>
I'm not seeing the lovely pink rectangle (neither in the layout editor nor on an actual device). I don't understand what's wrong.
I checked your code and mDrawable is not null, but its size is -1 by -1.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    mDrawable.setBounds(0, 0, View.MeasureSpec.getSize(widthMeasureSpec), View.MeasureSpec.getSize(heightMeasureSpec));
}
this does the trick for me. I do not know if this is what you want, but maybe it's a starting point
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With