You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中不使用XML如何创建AttributeSet?能否直接用数组生成?

结论

可以实现你要的效果,但Android官方没有内置直接传入字符串数组生成AttributeSet的工具类,你可以通过两种方案自行封装实现:


方案1:自定义实现AttributeSet接口

AttributeSet本身是Android提供的接口,仅定义了读取属性的方法规范,你可以自行实现该接口,内部维护自定义的属性集合,直接对外提供传入属性字符串数组的构造方法。
简单实现示例:

Kotlin代码

class ArrayAttributeSet(private val attrs: Array<String>) : AttributeSet {
    // 实现AttributeSet接口的所有必要方法,比如获取属性数量、属性名、属性值等
    override fun getAttributeCount(): Int = attrs.size
    override fun getAttributeName(index: Int): String = attrs[index].split("=")[0]
    override fun getAttributeValue(index: Int): String = attrs[index].split("=")[1]
    // 其余接口方法按需实现,比如命名空间相关、类型转换相关方法
}

// 使用方式和你期望的完全一致
val attrs: AttributeSet = ArrayAttributeSet(arrayOf(
    "android:orientation=Horizontal",
    "android:layout_height=match_parent"
))

Java代码

public class ArrayAttributeSet implements AttributeSet {
    private String[] attrs;
    public ArrayAttributeSet(String[] attrs) {
        this.attrs = attrs;
    }
    // 实现AttributeSet所有必要方法
    @Override
    public int getAttributeCount() {
        return attrs.length;
    }
    @Override
    public String getAttributeName(int index) {
        return attrs[index].split("=")[0];
    }
    @Override
    public String getAttributeValue(int index) {
        return attrs[index].split("=")[1];
    }
    // 其余接口方法按需实现
}

// 使用方式
AttributeSet attrs = new ArrayAttributeSet(new String[]{
    "android:orientation=Horizontal",
    "android:layout_height=match_parent"
});

方案2:基于官方Xml解析能力封装

如果你不想自己实现完整的AttributeSet接口,可以将属性数组拼接成简单的XML标签内容,再通过官方的Xml.asAttributeSet方法生成实例,这种方式完全兼容官方属性解析逻辑,不需要自己处理命名空间、类型转换等适配问题。
示例逻辑:

// 拼接简单的XML标签
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<View ");
for (String attr : yourAttrArray) {
    xmlBuilder.append(attr).append(" ");
}
xmlBuilder.append("/>");
// 解析XML生成AttributeSet
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(xmlBuilder.toString()));
parser.next();
AttributeSet attributes = Xml.asAttributeSet(parser);

注意事项

使用android:前缀的系统属性时,需要确保命名空间正确声明,值为http://schemas.android.com/apk/res/android,否则系统View无法正确识别属性。

内容的提问来源于stack exchange,提问作者Bret Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:54:08