一。
根据资源id取得文件名字
view.getResources().getResourceName(resid)
二。
动态获取资源id (反射|根据名字获取)
我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句:
btnChecked=(ImageView)findViewById(R.id.imgCheck);
findViewById是我们获取layout中各种View 对象比如按钮、标签、ListView和ImageView的便利方法。顾名思义,它需要一个int参数:资源id。
资源id非常有用。Android回自动为每个位于res目录下的资源分配id,包括各种图片文件、xml文中的”@+id”对象。res的子目录几乎总是固定的,比如每次都能见到的:drawable-xxxx、layout、values,以及不常见的:anim、xml、row、color。
Android教科书上告诉你:
res/drawable/用来存放图片文件;
res/layout/用来存放布局定义文件;
res/values/用来存放一些变量、参数等文件。
这都是我们已经知道的。此外,Android会为res目录下的所有资源分配id,其主要的分配原则是:
drawable中的图片文件总是每个文件一个资源id。
Xml文件中每个使用android:id=”@+id/xxx”的view都会被分配一个未用的资源id。
其他更复杂的规则也许每个人都会补充一些。
在 ADK 的API 中,有许多方法其实都会使用资源id作为参数,比如 getDrawable 方法 :
getResources().getDrawable(R.drawable.sendsms_bk));
从字面上看,getResouces方法返回一个android.content.res.Resources对象。
getDrawalbe方法返回一个Drawable对象,我们知道这就是一张图片。
getDrawable方法使用的参数就是资源id。
但是,这些int型的资源id到底是些什么数字?或者它们都放在哪里。如果你够细心,你可以在gen目录的R.java文件中找到它们。每个16进制整型id都有一个很O-O 的属性名字,它们都是public static final的,建议你不要手动去修改它们。这些资源id位于不同类层次结构中,你仔细看一看,会发现其中的一些规律,比如,drawable类中包含资源id其实代表了res/drawable目录中的图片文件;layout类中包含的资源id其实是代表了在res/layout目录中的xml文件 ;id类中包含的资源id其实是代表了布局xml文件中使用了 android:id=”@+id/xxx”的widget对象——当然如果你使用的是”@+Tyre/xxx”,则Android编译时会在R.java 中创建一个叫做 Tyre 的类。
通过上面的了解,我们发现资源id就是以“R.”开头的变量或属性——因为它都定义在R类中——这个类跟android.R不是同一个R,它们不在同一个包层次中。前者是定义了android框架自己的资源,比如:android.R.layout.simple_expandable_list_item_1、android.R.layout.simple_expandable_list_item_2。这些资源你使用过吗?有时间不妨试试。而另一个R就是我们自己的R了,定义了我们自己的资源id。我们可以用面向对象的R.xxx.yyy的方式使用资源id,当然也可以直接用16进制数来使用它们。
资源id在Android中是如此重要,因此我们只要获得了资源id,即可获得资源。因为某些情况下,我们不能使用某个常量作为资源id(因为我们想用一个变量代替它),所以只能采用两种方式动态获取资源id:
1、反射
java的反射是如此强大,以至于我们在走投无路时总是想起它。我们来看一段代码:
try{
Field field=R.drawable.class.getField(type);
int i= field.getInt(new R.drawable());
Log.d(tag,i+"");
return i;
}catch(Exception e){
Log.e(tag,e.toString());
return R.drawable.unknow;
}
type是一个变量,他的可能值会是“close”、“edit”、“icon”等。我们通过java的反射类Field 去访问 R.drawable 类下面的某个字段。实际上,我们知道在R.drawable 下的字段就是 res.drawable-xxxx 目录下的图片文件的资源id。因此运行上面的这段代码,其实就是通过一个字符串去获取对应图片文件的资源id。比如,当 type 的值为“icon”时,上面的代码会获得res.drawable-xxxx目录下的 icon.png 图片文件的资源id并返回给我们。我们通过资源 id 来把图片显示在ImageView中就是顺理成章的事了。
2、使用Resources 类的 getIdentifier方法
使用反射毕竟还是麻烦。如果同样的事情用 android.content.res.Resources 类来干,就是两句话而已:
Resources res=getResources();
return res.getIdentifier(type,"drawable",getPackageName());
getResources方法是来自于contenxt(也就是Activity类),它直接可以返回一个Resouces对象。而Resouces的getIdentifier方法可以返回R.java中的任何资源id,当然,你必须指定3个参数:字段名,类名,包名。包名指定了的 全限定名的包名部分,如果R 的全限定名为 android.R 或者 com.company.R,则包名在这里就是“android”或“com.company”。getPackageName其实是this.getPackageName(),它直接返回本类的包名。
类名则是资源所属的类。比如我们知道的,在R.java 类中的几个固定的类:drawable、id、string、layout等,在它们下边又定义了许多资源id。
字段名则是资源id的名字。比如这个资源id定义: public static final int del=0x7f020002;
del就是一个资源id的名字,0x7f020002则是它的16进制值。
通过3个参数,getIdentifier 方法就可以通过比较动态的方式获得资源id。
分享到:
相关推荐
Android的apk文件反编译后,甚多的资源和java文件无法对应,java文件中引用的资源id变成十进制数字。本文将反编译apk的java文件和资源文件重新关联引用对应,使得java文件能准确无误地重新引用资源文件。 (1)将反...
当我们在进行上传代码到Git、SVN仓库时,通常需要先配置忽略文件,这样主要是方便上传的代码下载的时候不会与编译器和Gradle的版本发生冲突,能够保证下载的代码能正常运行。 操作步骤 打开Android Studio中的File下...
Android布局文件的属性值解析说明: 1 android:id [为控件指定相应的ID] 2 android:text [指定控件当中显示的文字 需要注意的是 这里尽量使用strings xml文件当中的字符串] 3 android:gravity [指定View组件的对齐...
Android中获取资源 id 及资源 id 的动态获取 我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句: btnChecked=(ImageView)findViewById(R.id.imgCheck); findViewById是...
Android_如何置底一个View(附_前置声明layout布局文件中的资源ID)
本文实例讲述了android从资源文件中读取文件流并显示的方法。分享给大家供大家参考。具体如下: 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private void doRaw(){ ...
Android读取资源文件的方法 1、放入到资源文件夹里面,也就是所创建android工程的res下面。 我们可以在里面建立文件夹,放置我们要读取的文件。 例如:res里面建立目录raw,将要读取的文件abc.bin放入到该文件夹...
Android Studio对模块化开发提供的一个很有用的功能就是可以在主项目下新建库项目(Module),但是在使用库项目时却有一个问题就是资源ID冲突,因为编译时SDK会自动帮我们处理这个问题,所以一般我们不会察觉到,...
3、在布局文件中添加textView组件,设置android:text属性 @string/xxx,xxx代表fontstrings中的name名称 android:id="@+id test" android:text="@string/tint20" /> 4、Activity中进行如下设置 Typeface font= ...
Android 读取资源文件实例详解 本文主要介绍 Android 读取资源文件,直接从 assets 读取,从 Raw 文件中读取,InputStream 转 String。 以下为直接从assets读取: /** * 得到Assets里面相应的文件流 * * @...
// images:用来根据后缀显示的图标资源ID。 // 根目录图标的索引为sRoot; // 父目录的索引为sParent; // 文件夹的索引为sFolder; // 默认图标的索引为sEmpty; // 其他的直接根据后缀进行索引,比如.wav...
Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx....
一、颜色资源1、颜色XML文件格式 代码如下:<?xml version=”1.0″ encoding=”utf-8″?><resources> //resources根元素 ””>#000000</color>//color子元素 2、引用格式: java代码中:R.color.color_name ...
Android资源混淆工具,资源混淆组件不涉及编译过程,只需输入一个apk(无论签名与否,debug版,release版均可,在处理过程中会直接将原签名删除),可得到一个实现资源混淆后的apk(若在配置文件中输入签名信息,可自动...
与 Android Market 联机;支持谷歌 “ 街景 ” 服务;包装盒内附 数据工具包。 更多信息 https://sites.google.com/a/android.com/opensource/release-features Android Android Android Android 盈利模式 Android ...
shell脚本编写的功能,在Linux和mac终端上运行;主要用于Android studio下的Android项目,自动清除项目drawable、mimap、layout和menu下无用的资源文件
本文实例讲述了Android播放assets文件里视频文件相关问题。分享给大家供大家参考,具体如下: 今天做了一个功能,就是播放项目工程里面的视频文件,不是播放SD卡视频文件。 我开始尝试把视频文件放到 assets文件目录...
平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ ...
Android String资源文件插入值实例详解 我们在用string字符串资源文件引用的时候,有时候会遇到一串字符串要在中间插入一个值的问题, 比如 登录名: XXX,这里XXX是变化的。这时候我们可能会想到拼接。其实也可以...
前面的Android应用中已经大量使用了简单图片,图片不仅可以使用ImageView来显示,也可以作为Button、...接下来既可以在XML资源文件中通过@drawable/file_name访问该Drawable对象的ID,如果Java程序中需要获取实际的Draw