【问题标题】:Programmatically getting xml namespace in Android app以编程方式在 Android 应用程序中获取 xml 命名空间
【发布时间】:2016-02-26 23:32:05
【问题描述】:

Android 的AttributeSet.getAttributeIntValueString 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.getAttributeIntValueattrs 中读取属性。因此,代码和 GUI 是完全分开的。但是,如果在 GUI 中更改了命名空间,那么在代码中硬编码命名空间时就会出现问题。 (这确实发生了。所以,我正在努力弄清楚如何避免它再次发生!)

【问题讨论】:

  • 你到底想做什么?好像你正在使用AttributeSet ,你应该使用TypedValue
  • 我为这个问题添加了一些上下文。我看不出TypedValue 与我有什么关系……
  • 如果你需要从属性中读取一些东西,TypedArray 是要走的路,你不应该直接使用 AttributeSet
  • 鉴于AttributeSet attrs 被构造函数作为输入,我如何使用TypedValueTypedArray 恢复特定的整数属性?目前我简单使用attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto", "myAttribute", 0),其中第一个参数是命名空间,第二个是属性名,第三个是默认值。 (根据我的问题,这是不可取的,因为我对命名空间进行了硬编码。)
  • 只是在我做一个完整的答案之前确定,你有一个自定义属性并且你想在你的布局中使用它,就这样吗?

标签: android xml namespaces


【解决方案1】:

如果您的视图需要自定义属性并希望在代码中使用它,您可以关注documentation about custom views。基本上,你在styleable 中声明你的属性,然后使用obtainResources 来获取它们。

【讨论】:

  • 我只想要命名空间。例如,我想避免使用attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto", "myAttribute", 0),因为我对"http://schemas.android.com/apk/res-auto" 进行了硬编码。在另一个方向上,如果找不到“myAttribute”,我会很高兴看到编译器错误。
猜你喜欢
  • 2011-03-16
  • 2013-05-14
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多