可以有关于自定义android属性的条件语句吗?

时间:2013-04-18 15:42:46

标签: android xml attr

大多数人都知道有可能在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时才有可能......有人可以证明我错了吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

如果我理解你,你有一个自定义视图,可以在第三个属性上获得不同的属性。

为了让XML程序员了解非法属性,我建议采用以下两种方法之一:

  1. (简单方法)为每个“名称”及其自己的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>
    
  2. (更完整但更复杂)为XML创建XSD架构,这样程序员就可以根据您的规则验证XML。 XSD本身就是XML,因此您只需要学习这些元素。有关XSD的更多信息,请参阅this link,如果您也想了解网页上有大量信息。