Android中怎么指导ImageButton使用的是哪个resource id?
我是这样设置的ImageButton的背景ImageButtonbutton;button.setImageResource();有没有什么办法取回背景资源,类似getI...
我是这样设置的ImageButton的背景ImageButton button;button.setImageResource();有没有什么办法取回背景资源,类似getImageResource的功能。
展开
展开全部
Android中的R.java文件是android自动生成的资源文件,因为java是不能直接访问xml文件的,但是android的布局是在xml文件中写的,所以需要借助R.java文件来获取布局文件中的android组件。
在布局文件中使用android:id="@+id/testid"来唯一标识这个组件id是不能重名的。
在java文件中可以通过(ImageView)findViewById(R.id.testid);来获取id,也就是相当于实例化吧。
findViewById是我们获取layout中各种View 对象比如按钮、标签、ListView和ImageView的便利方法。
资源id在Android中是如此重要,因此我们只要获得了资源id,即可获得资源。因为某些情况下,我们不能使用某个常量作为资源id(因为我们想用一个变量代替它),所以只能采用两种方式动态获取资源id
下面是动态获取id的2中方法
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进制值。
在布局文件中使用android:id="@+id/testid"来唯一标识这个组件id是不能重名的。
在java文件中可以通过(ImageView)findViewById(R.id.testid);来获取id,也就是相当于实例化吧。
findViewById是我们获取layout中各种View 对象比如按钮、标签、ListView和ImageView的便利方法。
资源id在Android中是如此重要,因此我们只要获得了资源id,即可获得资源。因为某些情况下,我们不能使用某个常量作为资源id(因为我们想用一个变量代替它),所以只能采用两种方式动态获取资源id
下面是动态获取id的2中方法
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进制值。
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
2013-08-11
展开全部
你为何要取回这个资源呢。是要复用图片吗,如果是的话 试一试这个吧button.getDrawable();下面这两个方法设置图片内容的方法差不多button.setImageDrawable(drawable)button.setImageResource(resId)或者设置的时候改用button.setBackgroundDrawable(d)button.setBackgroundResource(resid)取回的时候用 button.getBackground()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-11
展开全部
View.getId()可以知道view所用的资源id。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-11
展开全部
这个直接获取有困难,我觉得你setImageResource的时候,再添一条setTag语句,需要取回资源id的时候调用getTag
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |