TypedArray无效

时间:2011-09-19 14:24:01

标签: android xml-attribute xml-layout typedarray

我正在学习自定义组件,我在自定义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 个答案:

答案 0 :(得分:8)

好的,我找到了我的问题的答案。答案是我只是使用我的自定义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>
一切顺利。

答案 1 :(得分:3)

在Gradle项目中,使用

  

的xmlns:customView =&#34; HTTP://schemas.android.com/apk/res-auto"

这适合我!