安卓开发小技巧,教你们如何用文本 XML 动态生成界面。

2021-07-21 11:41:14 +08:00
 3dwelcome

第一步,运行时动态下载 Layout XML 文件,用 binxml 之类的工具函数,转换成 Byte[]类型的二进制 XML (模仿 AndroidStudio 的资源编译流程)

第二步,把每个按钮的资源 ID 包名赋值一下,因为动态载入 Layout 的 JAVA 函数,会自动去 resources.arsc 资源列表查找对应的 ID,而按钮是动态生成的,根本就没有 ID,需要随便分配一个,只要当前 View 内不重复即可。

第三步,用 LayoutInflater.inflate 和老外写的 XmlBlock 内部资源解析函数,正式加载二进制 XML 界面,转换成 View 组件。( https://github.com/liudongmiao/preference-fragment-compat/blob/master/src/me/piebridge/android/preference/PreferenceFragment.java#L235 )

第四步,用 findViewById 查找按钮的 view, 用 setOnClickListener 设置响应事件,setContentView 显示出来,搞定收工。

6038 次点击
所在节点    Android
24 条回复
gam2046
2021-07-22 10:12:46 +08:00
实际应用场景太局限了,相比之下,WebView 是成本更低的选择。
zhanlanhuizhang
2021-07-23 18:33:04 +08:00
现在走这条路的最好的应该是美团吧: https://tech.meituan.com/2019/08/15/mtflexbox-automation-buried-point-exploration.html https://tech.meituan.com/2019/09/19/litho-practice-in-dynamic-program-mtflexbox.html
就是我昨天说过的用通过下发 json 。里面包含三端统一的 xml 文件。但是现在美团都转向 react,和 Flutter 。主要原因就是:截取美团自我评价( MTFlexbox 基本上支持 Native 上常用的基础控件的展示,对有 UI 定制化的需求支持度很高。但 MTFlexbox 的 XML 布局需要在运行前编写完成,只支持简单的三元表达式,逻辑能力有限。因此,MTFlexbox 特别适合布局样式复杂、变动频繁但交互简单的业务场景。例如美团 App 首页、搜索结果页等。这些业务场景都具备以下两个特点:

面向多业务方:各业务方有自己的个性化丰富样式,且不同时期可能需要不同的样式。

交互简单:点击跳转完成流量输送的简单交互。)
hyb1996
2021-07-25 17:22:40 +08:00
直接 aapt 编译后下发给客户端,几行代码拦截下 resources,就直接能和原生的 xml 一样用了
F1ReKing
2021-07-28 09:34:42 +08:00
compose 来了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/790800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX