android程序换肤的一种思路的难关, 怎样去掉R类定义中的final限制符?

时间:2021-04-09 09:54:10
才发现android程序不支持换肤的
于是我就想到定义很多种样式, 如:
mini_text
mini_text_Theme1
mini_text_Theme2
当用户先择了Theme2时,就把R.style.mini_text的值替换为R.style.mini_text_Theme2的值.
于是就引出一个问题,怎样才能让自动生成的R类里没有final限制符?

13 个解决方案

#1


不使用系统自带资源处理呗

#2


这个应该不是很难,就是定义一些图片和theme,style什么的

#3


有其他编程经验的人都会想当然的认为theme是style的父集, 只要改了theme, style集也会跟着更改。
我觉android不完善的体现之一就是,很多想当然的都没有....

#4


该回复于2012-01-05 13:11:07被版主删除

#5


想通过编译资源来换的可能性很小,一般都是从文件系统中读取资源文件。
因为皮肤必须是可以动态增加的,如果使用r资源,就只能使用编译时的那些东西,显然不符合要求。

做到使用特定的接口设置图片资源和样式,那改皮肤是水到渠成的事情。

#6


搬个小凳子,坐等大神出马。。。。

#7


实现了这种思路了,但无效,估计是布局文件编译后,直接就确定写死了style的int值了,而不是运行时来确定的.
散分了....

#8


呀、还真没考虑过这个问题呢
     等大牛出来解答

#9


我没有想出好办法,Mark一下,我觉得苦想怎样才能让自动生成的R类里没有final限制符这条路,不会得到答案的。

#10


我己经让自动生成的R类里没有final限制符了:
找到E:\android-sdk\platform-tools\aapt.exe 用UltraEdit打开
切换到非二进制模式, 搜索final, 找到第1345行的final
切换到二进制模式, 将final每个字符对应的16进制,改为20
最后保存一下就可以了

#11


去掉final后,能否实现换肤??

#12


引用 10 楼 youfayoutian 的回复:
我己经让自动生成的R类里没有final限制符了:
找到E:\android-sdk\platform-tools\aapt.exe 用UltraEdit打开
切换到非二进制模式, 搜索final, 找到第1345行的final
切换到二进制模式, 将final每个字符对应的16进制,改为20
最后保存一下就可以了


好办法!

#13


自己实现了两种方式的换肤
其实可以从资源访问和资源XML解析的角度去处理
有兴趣可以私聊 
改动涉及到AAPT PackageManger ZipIO Resource XMLParse

#1


不使用系统自带资源处理呗

#2


这个应该不是很难,就是定义一些图片和theme,style什么的

#3


有其他编程经验的人都会想当然的认为theme是style的父集, 只要改了theme, style集也会跟着更改。
我觉android不完善的体现之一就是,很多想当然的都没有....

#4


该回复于2012-01-05 13:11:07被版主删除

#5


想通过编译资源来换的可能性很小,一般都是从文件系统中读取资源文件。
因为皮肤必须是可以动态增加的,如果使用r资源,就只能使用编译时的那些东西,显然不符合要求。

做到使用特定的接口设置图片资源和样式,那改皮肤是水到渠成的事情。

#6


搬个小凳子,坐等大神出马。。。。

#7


实现了这种思路了,但无效,估计是布局文件编译后,直接就确定写死了style的int值了,而不是运行时来确定的.
散分了....

#8


呀、还真没考虑过这个问题呢
     等大牛出来解答

#9


我没有想出好办法,Mark一下,我觉得苦想怎样才能让自动生成的R类里没有final限制符这条路,不会得到答案的。

#10


我己经让自动生成的R类里没有final限制符了:
找到E:\android-sdk\platform-tools\aapt.exe 用UltraEdit打开
切换到非二进制模式, 搜索final, 找到第1345行的final
切换到二进制模式, 将final每个字符对应的16进制,改为20
最后保存一下就可以了

#11


去掉final后,能否实现换肤??

#12


引用 10 楼 youfayoutian 的回复:
我己经让自动生成的R类里没有final限制符了:
找到E:\android-sdk\platform-tools\aapt.exe 用UltraEdit打开
切换到非二进制模式, 搜索final, 找到第1345行的final
切换到二进制模式, 将final每个字符对应的16进制,改为20
最后保存一下就可以了


好办法!

#13


自己实现了两种方式的换肤
其实可以从资源访问和资源XML解析的角度去处理
有兴趣可以私聊 
改动涉及到AAPT PackageManger ZipIO Resource XMLParse