Android通过注解来初始化控件

来源:互联网 发布:数据库爆破工具 编辑:程序博客网 时间:2024/05/22 13:00

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();@Overrideprotected 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里处理的事情 */@Overridepublic void init() {}@Overridepublic void setListener() {tv.setText("TextView注解成功");bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {tv.setText("Button注解成功");}});}@Overridepublic int getLayoutId() {return R.layout.activity_main;}}
    OK,就是这么简单,通过java的反射机制简化了多少代码,提高了多少开发效率。不过貌似这种方式会对效率有点影响。



0 0
原创粉丝点击