Редактор макетов не передает настраиваемый атрибут в пользовательский класс View

Я создаю FixedAspectImageView чтобы решить проблему в Android сделать ImageView установите границы вида, чтобы соответствовать соотношению сторон изображения, содержащегося внутри, а также заполните произвольно широкую (или высокую) доступную область и растяните изображение соответствующим образом. В текущей версии я отправляю параметр "коэффициент" с плавающей точкой из макета, хотя в конечном итоге я намерен определить соотношение изображения.

Однако у меня проблемы с настраиваемыми атрибутами. Мой attrs.xml имеет это:

<resources>
    <!-- other stuff, which bizarrely works -->
    <declare-styleable name="FixedAspectImageView">
        <attr name="ratio" format="float"/>
    </declare-styleable>    
</resources>

Мой конструктор выглядит так:

public FixedAspectImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    if(attrs!=null) {
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FixedAspectImageView);
        if(a.hasValue(R.styleable.FixedAspectImageView_ratio)) {
            setRatio(a.getFloat(R.styleable.FixedAspectImageView_ratio, 1.f));
        }
        a.recycle();
    }
}

(и очень похоже на тот, у которого целочисленный defStyle в конце) и мой файл макета выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mypackage="http://schemas.android.com/apk/res/com.my.package"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <com.my.package.view.FixedAspectImageView
            android:id="@+id/fixedAspectImageView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitXY"
            android:src="@drawable/picture_of_goatse"
            mypackage:ratio="1.2329" />

    </FrameLayout>

</LinearLayout>

Я определил, что setRatio(Float) работает, потому что, если я установлю значение в источнике, система измерения работает отлично. Переданный TypedArray не имеет установленных индексов. Что вызывает это?

1 ответ

Решение

Редактор макетов не всегда подбирает <declare-styleable> атрибуты сразу. Перезапуск затмения решил проблему. Выше код был все правильно; имя пакета, очевидно, должно быть пакетом проекта для пространства имен в макете, а пользовательский View будет использовать сгенерированные значения из R.styleable,

Известная проблема:

https://code.google.com/p/android/issues/detail?id=52298

Другие вопросы по тегам