Android 图标包的一些资料(续)

前文见《Android 图标包的一些资料》。

这几天在 app 里发现个 bug,枚举出的图标包中的图标数量,比该图标包自己声称的还要多。了解了一下发现,又是一例用想当然的思路贪图抄近路省力气而挖下的坑。枚举图标不是去处理 appfilter.xml 而是处理了 drawable.xml

之前没有注意过后者,所以又查了一下。在一篇时间久远但言简意赅的文档里,确实明确提到了 drawable.xml,说明此文件由来已久。顺便补充一下,不管是 appfilter.xml 还是 drawable.xml,它们“应该”同时存在于两个位置,res/xml 下和 assets 下。

图标包是为启动器服务的,其中包含有未指定应用目标的图标是没有意义的,由此可知,表述了图标与其应用目标 app 的关系的 appfilter.xml 中应该已经将所有图标罗列完整,那 drawable.xml 的意义何在?

appfilter.xml 中的条目大致是这样,<item component="ComponentInfo{com.android.chrome/com.google.android.apps.chrome.Main}" drawable="ic_webbrowser"/>。在实际中,可以找到若干个 component 对应于同一个 drawable 的用例。也就是说,一个图标包支持的 app 的数量可能会大于其中包含的图标的数量。很明显,正如同名字本身就已经指示出的那样,appfilter.xml 其实并不是对图标的收录信息,而是对 app 的收录信息。

但图标包通常是一个含有展示自己所囊括图标的简易 app。在出现多个 app 指向共同的图标的情况下,不应该在展示的时候向用户呈现出这种图表的重复使用情况。从这个角度而言,每个图标本身需要有属于自己的描述信息。这就是 drawable.xml 可以来解决的了。在 drawable.xml 中的条目类似这样,<item drawable="ic_webbrowser" name="浏览器" />。每个 item 都可能处于一个类似于 <category title="系统"> 这样的节点之内,以用于区分其类别。显然地,itemdrawable 属性与 appfilter.xmlitemdrawable 属性存在字面上的对应关系。

事实上,当意识到 drawable.xml 的历史如此久远时,我唯恐它还有另一个作用。这是 Android 平台之前存在的一个名为 drawables.xml (注意其中 s 字母的存在)的文件给我的启发。在其中,item 节点并非是只有属性,而且可以有值,像这样:<item name="ic_webbrowser" type="drawable">@android:drawable/ic_web_browser</item>。当然,如果 drawable.xml (注意其中没有 s 字母)允许类似的“重定向”(通常出于某种可理解但无法完全明确定位的灵活性所考虑),那恐怕也已经被时间的流沙磨洗殆尽了。

补充一下。图标包模板之前见到过若干个,但是近期还在更新的不太多,在这儿放两个吧:

发表回复

您的电子邮箱地址不会被公开。