您的位置:首页 > 移动开发 > Android开发

通过注解初始化绑定View

2015-08-30 13:26 471 查看


一、引言

Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情。当然Google一下你会发现有很多Android Annotations框架。比如比较有名的“Android
Annotations”,这样的框架很复杂,用起来也比较麻烦,还有一些BUG,第一次使用也花费了不少时间研究。也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的。本文主要是解决这两个问题,实现一个最简单的ViewInject.


二、原理

原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。


1、首先你需要了解一下Java的注解是如何工作的,如果你不了解可以先看一下相关的资料,这个比较简答。首先定义我们的注解类:

[java] view
plaincopy





/** 

 * view inect by id 

 *  

 * @author Lucky 

 *  

 */  

@Target(ElementType.FIELD)//表示用在字段上  

@Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时  

public @interface ViewInject {  

    int value() default 0;  

}  


2、我们需要定义个BaseActivity,在这个类中来解析注解

[java] view
plaincopy





/** 

 *  

 * @author Lucky 

 *  

 */  

public abstract class BaseActivity extends FragmentActivity {  

    /** 

     * get content view layout id 

     *  

     * @return 

     */  

    public abstract int getLayoutId();  

  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(getLayoutId());  

        autoInjectAllField();  

    }  

    /** 

     * 解析注解 

     */  

    public void autoInjectAllField() {  

        try {  

            Class<?> clazz = this.getClass();  

            Field[] fields = clazz.getDeclaredFields();//获得Activity中声明的字段  

            for (Field field : fields) {  

                // 查看这个字段是否有我们自定义的注解类标志的  

                if (field.isAnnotationPresent(ViewInject.class)) {  

                    ViewInject inject = field.getAnnotation(ViewInject.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();  

        }  

    }  

}  


3、完成上面的步骤后就是如何去使用了,示例代码如下:

[java] view
plaincopy





public class TestActivity extends BaseActivity {  

  

    @ViewInject(R.id.claim_statement)  

    private WebView mWebView;  

          

  

    @Override  

    public int getLayoutId() {  

        // TODO Auto-generated method stub  

        return R.layout.activity_claim;  

    }  

  

}  

注解反射只能提高写代码的效率,但是程序的执行效率确实相反的方向,不过影响不大。


三、参考资料

http://blog.csdn.net/linghu_java/article/details/48053063
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 布局