自定义布局,丢失 attrs.xml 中的自定义属性

Posted

技术标签:

【中文标题】自定义布局,丢失 attrs.xml 中的自定义属性【英文标题】:Custom Layout, losing custom defined attributes in attrs.xml 【发布时间】:2013-11-20 18:59:12 【问题描述】:

我在 attrs.xml 中有以下内容

  <declare-styleable name="ToolsView">
        <attr name="width_behaviour" format="reference" />
    </declare-styleable>

我的布局文件中有以下代码:

  <com.hidden.hidden2.view.ToolsView
        xmlns:app="http://schemas.android.com/com.hidden.hidden2"
        android:id="@+id/page_toolbar_container"
        android:layout_
        android:layout_
        android:layout_gravity="top|center_horizontal"
        android:background="@drawable/tools_background"
        android:gravity="center_horizontal"
        android:layerType="software"
        android:visibility="visible"
        app:width_behaviour="@integer/tools_view_width_behaviour" />

但是,当我尝试在类的构造函数中读取 app:width_behaviour 时

if (attributeSet != null) 
            TypedArray a = getContext().obtainStyledAttributes(attributeSet, R.styleable.ToolsView, 0, 0);
            final int N = a.getIndexCount();
            for (int i = 0; i < N; i++) 
                int attr = a.getIndex(i);
                switch (attr) 
                case R.styleable.ToolsView_width_behaviour:
                    widthBehaviour = a.getInteger(attr, -1);
                    break;
                
            

            a.recycle();

属性集不为null,但N为0——没有获取到自定义属性!所以它永远不会进入 for 循环。

知道为什么吗?我已经习惯了很多布局,这是我第一次遇到问题。

【问题讨论】:

【参考方案1】:

将属性的格式更改为整数或维度(取决于您在 width_behaviour 下的意思),它应该可以工作。参考是为了另一个目的。

【讨论】:

还是不行? hhh...什么是getContext?为什么不使用 construstor 参数中的上下文? 超级构造函数已经执行,所以技术上我可以从视图的 getContext() 中获取它。我没有直接得到它,因为这是在 super(context, attrs) 调用之后定义的初始化方法中。无论如何,我发现了错误,请参阅下面的答案。 是的,我看到你修好了)【参考方案2】:

哎哟。这是一个相当愚蠢的错误。

查看 xmlns:app 的定义 - xmlns:app="http://schemas.android.com/com.hidden.hidden2" 应该是 xmlns:app="http://schemas.android.com/apk/res/com.hidden.hidden2"

我的声明中不知何故缺少 /apk/res/ 部分。

希望有一天这对某人有所帮助。

【讨论】:

以上是关于自定义布局,丢失 attrs.xml 中的自定义属性的主要内容,如果未能解决你的问题,请参考以下文章

Android中的自定义属性attrs

Android——自定义View

继承ViewGroup自定义View:步骤attrs.xmlTypedArray

三步实现Android自定义控件的自定义属性,以及诡异错误 Unresolved reference: styleable

三步实现Android自定义控件的自定义属性,以及诡异错误 Unresolved reference: styleable

三步实现Android自定义控件的自定义属性,以及诡异错误 Unresolved reference: styleable