Android通过注解来初始化控件
对于Android大神的思想与能力我只能膜拜与学习了,这里就从大神哪里学来的通过注解来初始化控件简单的概述一下,省去了那么繁琐的findViewById步骤(找到了还要强转,真心醉了)。
原理
原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。
一、定义注解类ViewId.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created 2015/9/7 Administrator tianzhao
*/
// 表示用在字段上
@Target(ElementType.FIELD)
// 表示是在声明周期运行的
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewId {
int value() default 0;
}
二、定义BaseActivity.java基础类,在这个类中解析注解类
import android.app.Activity;
import android.os.Bundle;
import java.lang.reflect.Field;
public abstract class BaseActivity extends Activity {
/**
* 返回布局的ID
*/
public abstract int getLayoutId();
/**
* 初始化
*/
public abstract void init();
/**
* 设置监听
*/
public abstract void setListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
autoInjectAllField();
init();
setListener();
}
public void autoInjectAllField() {
try {
Class<?> clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();// 获得Activity中声明的字段
for (Field field : fields) {
// 查看这个字段是否有我们自定义的注解类标志的
if (field.isAnnotationPresent(ViewId.class)) {
ViewId inject = field.getAnnotation(ViewId.class);
int id = inject.value();
if (id > 0) {
field.setAccessible(true);
field.set(this, this.findViewById(id));// 给我们要找的字段设置值
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
三、最后就是MainActivity.java了
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends BaseActivity {
@ViewId(R.id.tv)
private TextView tv;
@ViewId(R.id.bt)
private Button bt;
/**
* 处理一些在onCreate里处理的事情
*/
@Override
public void init() {
}
@Override
public void setListener() {
tv.setText("TextView注解成功");
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv.setText("Button注解成功");
}
});
}
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
}
OK,就是这么简单,通过java的反射机制简化了多少代码,提高了多少开发效率。不过貌似这种方式会对效率有点影响。