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

无需逐个指定属性,如何程序化提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:26:38