大多数人都知道有可能在Android中为自定义视图提供自定义属性。例如在this thread here on Stackoverflow中,这个解释非常出色。我的问题是:
是否可以仅在满足其他条件时才提供此类属性?
我的意思是这样的(伪代码):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyCustomView">
<attr name="isClock" format="boolean" />
</declare-styleable>
<if name="isClock" value="true">
<attr name="timezone" format="string">
</if>
<else>
<attr name="somethingElse" format="string>
</else>
</resources>
现在,不必使用“错误”属性的一种可能性就是在Java代码中执行此操作,显然:
public class MyCustomView {
public MyCustomView(Context context) {
TypedArray styleables = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
boolean choice = styleables.getBoolean(R.styleable.MyCustomView_isClock, false);
if(choice) {
// It's a clock, react to the other attrs
} else {
// Don't react
}
styleables.recycle();
}
}
另一种方法是做ilomambo在他的回答中建议的:创建具有不同名称的各种自定义视图,并让它们只具有属于它们的属性。
但是我非常想问自己是否有可能不首先混淆.xml-File的程序员,并且只向他提供他真正需要的东西组合在一个地方。毕竟这个 以Android已经完成的方式(好吧...... IDE / Lint / Parser ......)暗示例如视图的宽度或高度应该设置为使用0dp
后的layout_weight
。
但是,如果我不得不猜测我可能只有在重写Android XML-Parser时才有可能......有人可以证明我错了吗?
提前致谢
答案 0 :(得分:1)
如果我理解你,你有一个自定义视图,可以在第三个属性上获得不同的属性。
为了让XML程序员了解非法属性,我建议采用以下两种方法之一:
(简单方法)为每个“名称”及其自己的declare-styleable
组创建一个自定义视图。
<resources>
<declare-styleable name="ClockCustomView">
<attr . . . />
</declare-styleable>
<declare-styleable name="OtherCustomView">
<attr . . . />
</declare-styleable>
<!-- Common attributes are declared outside declare-styleable -->
<attr . . . />
</resources>
(更完整但更复杂)为XML创建XSD架构,这样程序员就可以根据您的规则验证XML。 XSD本身就是XML,因此您只需要学习这些元素。有关XSD的更多信息,请参阅this link,如果您也想了解网页上有大量信息。