如果我们有很多的按钮都有点击事件的话,那么单单靠switch case是很麻烦的,因为你需要在每个case后面加上一个R.id.xx。这样的代码看起来不整洁也很麻烦。那么如果我们使用遍历的方法来处理的话就是方便许多。首先我们先来了解一下获取控件id的方式:
1:反射:
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方法
Resources res=getResources();
return res.getIdentifier(A1,"id",getPackageName());
第一个是字段,也就是你所要查找的id的ID的名字如 public static final int A1=0x7f09004e;中type的值就是A1,而第二个参数就是所处类的名字,我们知道在R.java中有很多的类,其中包括drawable、id等,而A1在类id中所以所对应的类也就是id了。第三个参数是类的包名,使用
getPackageName()直接返回所在类的包名
在知道如何获取控件的id后那么我们直接上核心代码
public void onClick(View v) {
//创建新的线程
final int id=v.getId();
new Thread(){
@Override
public void run() {//处理耗时间的操作
super.run();
senddata(id);
}
}.start();
}
//遍历id
public void senddata(int id){
Resources res=getResources();
String are="";
for(int i=1;i<17;i++){//判断所点击的id与控件中的哪个id相同,若相同则作出相应处理
if(id==res.getIdentifier("A"+i,"id",getPackageName())){
are="A"+i;
}else if(id==res.getIdentifier("B"+i,"id",getPackageName())){
are="B"+i;
}else if(id==res.getIdentifier("C"+i,"id",getPackageName())){
are="C"+i;
}else if(id==res.getIdentifier("D"+i,"id",getPackageName())){
are="D"+i;
}
}//利用message发送消息
Message message = Message.obtain();
message.obj=are;
mHandler.sendMessage(message);
}
//使用handler接收来自message传过来的值
Handler mHandler = new Handler(){
/**
* handleMessage接收消息后进行相应的处理
* @param msg
*/
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Intent intent=new Intent();
intent.setClass(Main.this, MainActivity.class);
intent.putExtra("user",user);
intent.putExtra("area",(String)msg.obj);
startActivity(intent);
}
};
通过所获取的id来对所有的控件进行判断,然后进行相应处理;