Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢

有些时候需要将res中的资源文件加载进来然后做一些修改,然后再赋值给控件使用,比如这样:

Drawable drawable = getResources().getDrawable(int id);
现在我需要把资源文件id所对应的Drawable对象加载进来,然后做向下转型处理,如果我不调试查看本身的类型的话,该怎么知道它到底是哪种类型呢?我们来通过源代码查看究竟:

首先我们找到getResources().getDrawable()方法:

    public Drawable getDrawable(int id) throws NotFoundException {synchronized (mTmpValue) {TypedValue value = mTmpValue;getValue(id, value, true);return loadDrawable(value, id);}}

这个方法并没有做什么,进入到loadDrawable方法中:

    /*package*/ Drawable loadDrawable(TypedValue value, int id)throws NotFoundException {if (TRACE_FOR_PRELOAD) {// Log only framework resourcesif ((id >>> 24) == 0x1) {final String name = getResourceName(id);if (name != null) android.util.Log.d("PreloadDrawable", name);}}final long key = (((long) value.assetCookie) << 32) | value.data;Drawable dr = getCachedDrawable(key);if (dr != null) {return dr;}Drawable.ConstantState cs = sPreloadedDrawables.get(key);if (cs != null) {dr = cs.newDrawable(this);} else {if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT &&value.type <= TypedValue.TYPE_LAST_COLOR_INT) {dr = new ColorDrawable(value.data);}if (dr == null) {if (value.string == null) {throw new NotFoundException("Resource is not a Drawable (color or path): " + value);}String file = value.string.toString();if (DEBUG_LOAD) Log.v(TAG, "Loading drawable for cookie "+ value.assetCookie + ": " + file);if (file.endsWith(".xml")) {try {XmlResourceParser rp = loadXmlResourceParser(file, id, value.assetCookie, "drawable");dr = Drawable.createFromXml(this, rp);rp.close();} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}} else {try {InputStream is = mAssets.openNonAsset(value.assetCookie, file, AssetManager.ACCESS_STREAMING);//                System.out.println("Opened file " + file + ": " + is);dr = Drawable.createFromResourceStream(this, value, is,file, null);is.close();//                System.out.println("Created stream: " + dr);} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}}}}if (dr != null) {dr.setChangingConfigurations(value.changingConfigurations);cs = dr.getConstantState();if (cs != null) {if (mPreloading) {sPreloadedDrawables.put(key, cs);} else {synchronized (mTmpValue) {//Log.i(TAG, "Saving cached drawable @ #" +//        Integer.toHexString(key.intValue())//        + " in " + this + ": " + cs);mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));}}}}return dr;}

这一大段我们看主要的:

                if (file.endsWith(".xml")) {try {XmlResourceParser rp = loadXmlResourceParser(file, id, value.assetCookie, "drawable");dr = Drawable.createFromXml(this, rp);rp.close();} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}} 
这里以selector说明,selector是定义在xml中的,我们就找到这个地方,它原来是使用XmlResourceParser来对xml资源文件进行解析的,咱们进去createFromXml方法内部一探究竟:

    /*** Create a drawable from an XML document. For more information on how to* create resources in XML, see* <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.*/public static Drawable createFromXml(Resources r, XmlPullParser parser)throws XmlPullParserException, IOException {AttributeSet attrs = Xml.asAttributeSet(parser);int type;while ((type=parser.next()) != XmlPullParser.START_TAG &&type != XmlPullParser.END_DOCUMENT) {// Empty loop}if (type != XmlPullParser.START_TAG) {throw new XmlPullParserException("No start tag found");}Drawable drawable = createFromXmlInner(r, parser, attrs);if (drawable == null) {throw new RuntimeException("Unknown initial tag: " + parser.getName());}return drawable;}
从这段代码中我们可以发现,最主要的工作是由方法createFromXmlInner来完成的,我们进去看看:

    /*** Create from inside an XML document.  Called on a parser positioned at* a tag in an XML document, tries to create a Drawable from that tag.* Returns null if the tag is not a valid drawable.*/public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)throws XmlPullParserException, IOException {Drawable drawable;final String name = parser.getName();if (name.equals("selector")) {drawable = new StateListDrawable();} else if (name.equals("level-list")) {drawable = new LevelListDrawable();} else if (name.equals("layer-list")) {drawable = new LayerDrawable();} else if (name.equals("transition")) {drawable = new TransitionDrawable();} else if (name.equals("color")) {drawable = new ColorDrawable();} else if (name.equals("shape")) {drawable = new GradientDrawable();} else if (name.equals("scale")) {drawable = new ScaleDrawable();} else if (name.equals("clip")) {drawable = new ClipDrawable();} else if (name.equals("rotate")) {drawable = new RotateDrawable();} else if (name.equals("animated-rotate")) {drawable = new AnimatedRotateDrawable();            } else if (name.equals("animation-list")) {drawable = new AnimationDrawable();} else if (name.equals("inset")) {drawable = new InsetDrawable();} else if (name.equals("bitmap")) {drawable = new BitmapDrawable();if (r != null) {((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());}} else if (name.equals("nine-patch")) {drawable = new NinePatchDrawable();if (r != null) {((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());}} else {throw new XmlPullParserException(parser.getPositionDescription() +": invalid drawable tag " + name);}drawable.inflate(r, parser, attrs);return drawable;}
噢噢,原来是这样啊,我定义什么样类型的图片,最后就有什么样的Java类型与之对应,原来我的selector对应StateListDrawable,恍然大悟,接下来就容易处理了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 35. 搜索插入位置(二分查找)

文章目录1. 题目信息2. 解题2.1 暴力遍历2.2 二分查找1. 题目信息 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1:输入…

青年人在美团是怎样成长的?

2020年五四青年节&#xff0c;我们采访了美团技术团队9位青年代表&#xff0c;他们是来自清华大学、北京大学、中国科学院大学等国内高校的2位博士研究生和7位硕士研究生。在这个属于青年人的特别的日子里&#xff0c;我们请他们分享了自己在美团成长的故事。 道阻且长&#xf…

Failed to execute goal org.apache.maven.plugins:maven-resources-plugin

maven打jar包错误 引起错误的原因是在 SpringbootStudyApplication 类中&#xff0c;加入了下面注释中的代码&#xff08;监听项目启动&#xff0c;然后打开浏览器&#xff09;&#xff0c;单纯删掉注释代码是无法解决问题的&#xff0c;可能的原因是由于加入这部分代码而impo…

它来了它来了!2020深度学习硬核技术干货集锦!

这份干货来自于今天要给大家推荐的一个深度学习与计算机视觉领域知名公众号&#xff1a;「极市平台」。从2016年创立至今&#xff0c;极市平台深耕于DL与CV领域&#xff0c;输出300篇高质量原创文章&#xff0c;并积累了近10万名海内外专业算法开发者。极市平台公众号坚持每日更…

容器的使用和创建虚拟环境 vitualenv

xshell jupter容器的使用方法 #容器相当于子服务器 1 创建指定python版本的虚拟环境 方法1&#xff1a; 1.安装虚拟环境的第三方包 venv pip install venv 2.创建虚拟环境 cd 到存放虚拟环境的地址 在当前目录下创建名为env的虚拟环境&#xff1a; python -m venv env python…

Android中动态的更改selector中某张图片的属性

在我们平常开发的时候会有许多状态按钮&#xff0c;比如state_pressed&#xff0c;android:state_checked&#xff0c;或者就正常状态等等&#xff0c;我们做这样的效果通常需要三个文件&#xff0c;一张是按下的图片&#xff0c;一张是正常状态的图片&#xff0c;一张是管理它…

LeetCode 17. 电话号码的字母组合(回溯)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例:输入&#xff1a;"23" 输出&#xff1a;[&…

细数一行代码改变结局的炼丹骚操作

文 | 陀飞轮&圈圈&年年的铲屎官源 | 知乎tips总结知乎答主&#xff1a;陀飞轮谈一下自己知道的。尽量避开优化器、激活函数、数据增强等改进。。先上完整列表&#xff1a;Deep Learning: Cyclic LR、FloodingImage classification: ResNet、GN、Label Smoothing、Shuff…

推荐收藏 | 美团技术团队的书单

4月23日对于世界文学而言是一个具有象征性意义的日子。1616年的这一天&#xff0c;塞万提斯、莎士比亚、印卡加西拉索德拉维加几位大师相继与世长辞。此外&#xff0c;这一天也是其他一些著名作家的出生和去世的日期&#xff0c;例如&#xff1a;莫里斯德吕翁、哈尔多尔K拉克斯…

论文浅尝 | 采用多层注意力机制的事件检测

笔记整理&#xff1a;杨帆&#xff0c;浙江大学计算机学院硕士&#xff0c;研究方向知识图谱。动机事件编码&#xff08;event encoding&#xff09;之前的工作集中在提取实体&#xff0c;检测触发单词以及匹配预定义的模板&#xff0c;这些方法存在以下缺点&#xff1a;首先它…

简单Nlp分析套路,获取数据(爬虫),数据处理(分词,词频,命名实体识别与关键词抽取),结果展现

简单NLP分析套路&#xff08;1&#xff09;----语料库积累之3种简单爬虫应对大部分网站&#xff1a; https://cloud.tencent.com/developer/article/1384454 简单NLP分析套路&#xff08;2&#xff09;----分词&#xff0c;词频&#xff0c;命名实体识别与关键词抽取&#xff…

在Activity启动过程中如何任务栈的栈顶是否是将要启动的Activity的实例

我们在ActivityStack类中可以看到某个方法用于返回当前任务栈顶端的ActivityRecord对象&#xff0c;如果栈是空的&#xff0c;就返回null&#xff0c;ActivityRecord用于代表在历史任务栈中的一个Activity对象的信息。 /*** Returns the top activity in any existing task ma…

无需人工!无需训练!构建知识图谱 BERT一下就行了!

文&#xff1a;Sherry今天给大家带来的是一篇号称可以自动建立知识图谱的文章《Language Models are Open Knowledge Graphs》&#xff0c;文中提出了一个叫Match and Map&#xff08;MAMA&#xff09;的模型&#xff0c;无需人工&#xff01;无需训练&#xff01;只需语料和预…

LeetCode 557. 反转字符串中的单词 III(栈)

文章目录1. 题目信息2. 解题2.1 栈2.2 STL reverse()1. 题目信息 给定一个字符串&#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1:输入: "Lets take LeetCode contest" 输出: "steL ekat edoCteeL tse…

美团OCTO万亿级数据中心计算引擎技术解析

美团点评自研的 OCTO 数据中心&#xff08;简称 Watt&#xff09;日均处理万亿级数据量&#xff0c;该系统具备较好的扩展能力及实时性&#xff0c;千台实例集群周运维成本低于10分钟。本文将详细阐述 Watt 计算引擎的演进历程及架构设计&#xff0c;同时详细介绍其全面提升计算…

中文实体命名识别工具使用汇总:Stanza、LAC、Ltp、Hanlp、foolnltk、NLTK、BosonNLP

实体命名识别相关知识Stanford CoreNLP 命名实体识别一、简介&#xff1a;二、java版本使用三、python版本使用NLTK 命名实体识别一、简介&#xff1a;二、搭建环境三、nltk使用1、英文实体命名初体验2、使用nltk来处理中文资料结巴分词使用foolnltk 命名实体识别一、简介二、p…

论文浅尝 | 基于知识图谱中图卷积神经网络的推荐系统

笔记整理&#xff1a;王若旭&#xff0c;浙江大学在读硕士&#xff0c;研究方向为关系抽取&#xff0c;零样本学习。本文发表于 www2019&#xff0c;参考链接&#xff1a;https://arxiv.org/pdf/1905.04413.pdf为了解决推荐系统中协同过滤方法面对的数据稀疏和冷启动的问题&…

手写字识别调研

项目地址&#xff1a;https://github.com/tesseract-ocr/tesseract Google的基于Tesseract的OCR识别小程序&#xff1a;https://www.cnblogs.com/rui1236/p/12155405.html CRNNCTCLoss中文手写汉字识别&#xff1a;https://www.sohu.com/a/313374838_787107 CNN在线识别手写中…

NeurIPS 2020 | Glance and Focus: 通用、高效的神经网络自适应推理框架

文 | rainforest wang源 | 知乎本文主要介绍我们被NeurIPS 2020会议录用的一篇文章&#xff1a;Glance and Focus: a Dynamic Approach to Reducing Spatial Redundancy in Image Classification代码和预训练模型已经在Github上面放出&#xff1a;https://link.zhihu.com/?tar…

如何下载Android源码(非常详细,含自动恢复下载,编译,运行模拟器说明)

今天终于把代码下载完成&#xff0c;特此开一篇博文记录一下。上图&#xff1a; 为了下载这些源码&#xff0c;历时5天5夜&#xff0c;说为什么这么长时间&#xff0c;是因为太容易中断了&#xff0c;有时候下一晚上可能就一直没在下&#xff0c;在你入睡的时候它就自己断了&am…