无需逐个指定属性,如何程序化提取Android Style的键值对?
问题描述
已定义的样式
我在res/values/styles.xml中定义了如下样式:
<style name="calculatorButton"> <item name="android:textSize">25sp</item> <item name="android:textStyle">bold</item> <item name="android:textColor">@color/black100</item> <item name="android:gravity">center</item> <item name="android:clickable">true</item> <item name="android:layout_width">0dp</item> <item name="android:layout_height">match_parent</item> <item name="android:layout_weight">1</item> </style>
核心需求
我需要程序化提取该样式的所有属性列表,无需逐个指定属性名称:
- 不需要通过
obtainStyledAttributes()获取精确类型的属性值(如int、String、Color),只需要得到字符串形式的键值对映射,示例如下:"android:textColor" -> "@color/black100" "android:gravity" -> "center" - 也可以接受获取样式的原始XML内容,再自行用
DocumentBuilder等工具解析,但res/values目录下的资源预编译后无法直接读取,且我不想将文件复制到assets或res/raw目录避免代码重复。
背景与遇到的问题
我们通过JNI获取布局XML字符串,自行解析并程序化创建View对象,示例代码:
Button bt = new Button(activityMain); bt.setTag(tag); bt.setLayoutParams(params); bt.setTextColor(color);
现在希望应用Java侧已定义的样式,原本的方案是:从XML字符串提取style属性值,通过getIdentifier获取资源ID,再传入View的四参构造函数:
int styleID = activityMain.getResources().getIdentifier( styleName, "style", activityMain.getPackageName() ); Button bt = new Button(activityMain, null, 0, styleID);
但该方案存在问题:MaterialButton、AppCompatTextView等自定义视图不支持四参构造函数,其他带AttributeSet或defStyleAttr的构造函数要么抛出ClassCastException,要么会跳过部分样式属性。
当前考虑的方案
目前考虑的最终方案是:提取目标样式的所有属性值,传入我们的解析器,由解析器执行对应的方法调用修改视图。如果有其他可行方案,欢迎告知。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

