在4.0平台定制widget开发过程中,因为要往源码中加入资源,遇到一个问题,问题的log没有记录下来,大体上就是讲,类型转换有问题。比如,一个button控件,findViewById后,转换类型当然要为button,但是根据这个button找到的控件,嘿,它不是button,它是个checkbox。这就有问题。有问题当然是要去找为什么会发生问题。经过R.java的查找,发现这两个控件的资源id是相邻的,比如button的id是42,checkbox的id就是43。
先来看看我都加了些什么资源:8张图片,放到drawable里面,类型style,主题theme还有attr,供上层使用的id在public.xml里面定义了。
我是怎么加的呢?图片直接定义为对应功能名字,这个没什么问题。style放到了styles.xml中间;主题theme也放到了theme.xml中间。public.xml中添加放到最后,数值为相应类型最大值然后+1。
找来找去,在style.xml和theme.xml的文件中发现这样一段话:
<!--
===============================================================
PLEASE READ
===============================================================
The Holo themes must not be modified in order to pass CTS.
Many related themes and styles depend on other values defined in this file.
If you would like to provide custom themes and styles for your device,
please see styles_device_defaults.xml.
===============================================================
PLEASE READ
===============================================================
-->
这段话我在2.3源码中是没有看到的。也就是我把style和theme加到人家说你别加的地方,出了点问题。
通过看SDK编译出的android.jar中R.java可以知道,R.java中的资源都是在public.xml中定义提供给上层使用的。这些id值在SDK中定义的大小要与系统生成的大小一致。如何一直,当然就是现在的形式:赋予一个固定的值。有了这个固定静态的值,你怎么折腾都不会有问题。其它资源在aapt生成id的时候,会跳过public.xml中已经使用的值。
除了public.xml中定义过的资源,其它的资源都是自动分配id,而且也都是在系统代码中使用的。这就是我今天的疑问所在。系统代码使用这些资源时,实际与我们app开发一样,是R.**.***这样的方式获得R.java相应的数值,并没有经过外部数值对应的转换。那如果是这样,为何出现了开头我提到的问题。style强调添加规则又是为了哪里着想?
小妹初学乍到,所知甚少,求各位大神鼎力相助,不胜感激。。。。