【发布时间】:2016-02-26 23:32:05
【问题描述】:
Android 的AttributeSet.getAttributeIntValue 将String namespace 作为输入。对命名空间进行硬编码似乎是个坏主意,因为如果命名空间发生更改,则会引入运行时错误。更具体地说,最好避免
attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto",
"myAttribute", 0)
因为它硬编码字符串"http://schemas.android.com/apk/res-auto",这似乎没有必要。 (诚然,它对"myAttribute" 进行了硬编码,但这似乎不可避免。)是否可以在不对名称空间进行硬编码的情况下读取整数属性"myAttribute"? (可能通过命名包含"myAttribute" 的xml 文件。)这样,如果出现任何问题,就会生成编译错误。 (例如,文件不再存在。)或者,如果找不到"myAttribute",是否可能产生编译器错误(这也将消除对默认值的需要,因为它永远不会被使用)。
上下文。我扩展了LinearLayout 来覆盖构造函数LinearLayout(Context context, AttributeSet attrs) 和LinearLayout(Context context, AttributeSet attrs, int defStyleAttr)。这些构造函数使用AttributeSet.getAttributeIntValue 从attrs 中读取属性。因此,代码和 GUI 是完全分开的。但是,如果在 GUI 中更改了命名空间,那么在代码中硬编码命名空间时就会出现问题。 (这确实发生了。所以,我正在努力弄清楚如何避免它再次发生!)
【问题讨论】:
-
你到底想做什么?好像你正在使用
AttributeSet,你应该使用TypedValue -
我为这个问题添加了一些上下文。我看不出
TypedValue与我有什么关系…… -
如果你需要从属性中读取一些东西,TypedArray 是要走的路,你不应该直接使用 AttributeSet
-
鉴于
AttributeSet attrs被构造函数作为输入,我如何使用TypedValue或TypedArray恢复特定的整数属性?目前我简单使用attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto", "myAttribute", 0),其中第一个参数是命名空间,第二个是属性名,第三个是默认值。 (根据我的问题,这是不可取的,因为我对命名空间进行了硬编码。) -
只是在我做一个完整的答案之前确定,你有一个自定义属性并且你想在你的布局中使用它,就这样吗?
标签: android xml namespaces