4

大多数人都知道在 Android 中可以为自定义视图提供自定义属性。例如,在 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 文件的程序员,而只向他提供他真正需要的东西组合在一个地方。毕竟这已经由 Android 完成了(嗯...... IDE/Lint/解析器......)当提示例如在使用时应该设置视图的宽度或高度0dplayout_weight

但如果我不得不猜测我会说这可能只有在我重写 Android XML-Parser 时才有可能......有人可以证明我错了吗?

提前致谢

4

1 回答 1

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 的更多信息,请参阅此链接,如果您也使用 google 搜索,网络上有很多信息。

于 2013-04-28T14:05:37.853 回答