TypedArray не работает - PullRequest
       70

TypedArray не работает

5 голосов
/ 19 сентября 2011

Я изучаю пользовательские компоненты и у меня возникли проблемы с пользовательскими атрибутами XML.Мой пользовательский компонент расширяет LinearLayout, и в конструкторе (public Custom(Context context, AttributeSet attrs)) я раздуваю макет XML (2 кнопки и 1 EditText).Я также объявил в values/attrs эти пользовательские атрибуты:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Custom">
        <attr name="initValue" format="integer" />
        <attr name="stepSize" format="integer" />
        <attr name="maxValue" format="integer"/>
    </declare-styleable>
</resources>

В конструкторе после того, как я надуваю макет, я пытаюсь прочитать пользовательские атрибуты следующим образом:

   if (attrs != null) {
                TypedArray ta = context.obtainStyledAttributes(attrs,
                        R.styleable.Custom, 0, 0);
                setInitValue(ta.getInt(R.styleable.Custom_initValue, 0));
                setStepSize(ta.getInt(R.styleable.Custom_stepSize, 1));
                setMaxValue(ta.getInt(R.styleable.Custom_maxValue, 5));         
                ta.recycle();
            }

Теперь я пытаюсь протестировать этот пользовательский компонент, добавив его в макет XML следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <here.is.my.package.Custom android:id="@+id/add"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        initValue="2" maxValue="7" stepSize="1" />
</LinearLayout>

Это не работает, и я получаю только значения по умолчанию (0, 1, 5).Я что-то упустил или это нормальное поведение?

Ответы [ 2 ]

8 голосов
/ 19 сентября 2011

Хорошо, я понял ответ на свой вопрос. Ответ состоял в том, что я просто использовал свои пользовательские атрибуты xml без пространства имен, а Android просто проигнорировал их и дал мне значения по умолчанию. После добавления моего пространства имен:

   <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:customAttribute="http://schemas.android.com/apk/res/gere.is.my.package"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <here.is.my.package.Custom android:id="@+id/add"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            customAttribute:initValue="2" customAttribute:maxValue="7" customAttribute:stepSize="1" />
    </LinearLayout>

все работало.

3 голосов
/ 14 марта 2016

В проектах Gradle используйте

XMLNS: customView = "http://schemas.android.com/apk/res-auto"

это работает для меня!

...