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
相关产品推荐
相关产品推荐

