文档章节

为Android引入依赖注入

r
 renhaixyz
发布于 2014/04/29 15:39
字数 371
阅读 449
收藏 0

在github上看到了 roboguice这个项目,发现里面的思路很不错,使用依赖注入的方法,可以省略满屏幕的控件以及其他变量的初始化操作,尤其findViewById ...

当然该项目中不仅仅就这么点功能,我只是把依赖注入给抽出来单独使用,这样可以不需要再引入该项目的jar包,毕竟也几百K的大小

主要使用示例:

InjectActivity.java 

public class InjectActivity extends BaseActivity {
	@InjectView(R.id.myTextView)
	TextView textView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.robo_layout);
		textView.setText("inject view");
	}
}

依赖的代码如下 

InJectView.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InjectView {
	public abstract int value() default (int) -1;

	public abstract java.lang.String tag() default "";
}

BaseActivity.java

public class BaseActivity extends Activity {
	@Override
	public void setContentView(View view, LayoutParams params) {
		super.setContentView(view, params);
		injectField();
	}

	@Override
	public void setContentView(View view) {
		super.setContentView(view);
		injectField();
	}

	@Override
	public void setContentView(int layoutResID) {
		super.setContentView(layoutResID);
		injectField();
	}

	private void injectField() {
		Field[] fields = this.getClass().getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			Annotation[] annotations = field.getAnnotations();
			if (annotations != null) {
				for (Annotation annotation : annotations) {
					if (annotation instanceof InjectView) {
						InjectView injectView = (InjectView) annotation;
						int value = injectView.value();
						if (value != -1) {
							try {
								field.set(this, findViewById(value));
							} catch (IllegalArgumentException e) {
								e.printStackTrace();
							} catch (IllegalAccessException e) {
								e.printStackTrace();
							}
						}
						break;
					}
				}
			}
		}
	}
}

当然,本文只是提供一种思路,尽量节省代码,让注意力集中到业务逻辑上,而非这种重复代码. 如果需要更加完善的功能,比如通过依赖注入的方法来初始化其他几种属性

  1. Preference

  2. Extra (例如getIntent().getStringExtra ....)

  3. Provider

  4. Resource

读者可以自己尝试动手将其丰富一下

© 著作权归作者所有

共有 人打赏支持
r
粉丝 1
博文 2
码字总数 474
作品 0
海淀
程序员
使用 Kotlin 构建 MVVM 应用程序—提高篇:Dagger-Android

写在前面 本篇是对于使用Kotlin构建MVVM应用程序—第四部分:依赖注入 Dagger2 的补充。 在依赖注入 Dagger2 这篇文章中,我们了解了 Dagger2 是如何进行依赖注入的。 可以简单的将Dagger2理...

ditclear
08/19
0
0
使用Kotlin构建MVVM应用程序—提高篇:Dagger-Android

写在前面 提高篇的目的是想着写一些较深入的知识,包含一些源码分析、架构设想、脚手架搭建的东西。 面向的人群是中高级的开发者或者愿意深入了解如何快速构建Kotlin&&MVVM应用的人群。 Dagg...

ditclear
06/27
0
0
组件化知识梳理(1) - Arouter 的基本使用

组件化知识梳理目录 组件化知识梳理(1) - Arouter 的基本使用 组件化知识梳理(2) - Arouter 源码分析之 Complier SDK 组件化知识梳理(3) - Arouter 源码分析之运行时 SDK 一、前言 放假几天在...

泽毛
04/11
0
0
android-swipelistview的开源项目的配置

android-swipelistview项目分两个部分: 1.lib是:android-swipelistview; 2.例子是:SwipeListViewExampleActivity。 进入正题: android-swipelistview: 1. 引入android-swipelistview库:导......

金馆长
2013/10/17
0
0
使用Kotlin构建MVVM应用程序—第四部分:依赖注入Dagger2

目录 使用Kotlin构建MVVM应用程序—总览篇 使用Kotlin构建MVVM应用程序—第一部分:入门篇 使用Kotlin构建MVVM应用程序—第二部分:Retrofit及RxJava 使用Kotlin构建MVVM应用程序—第三部分:...

ditclear
05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用户体验要素——以用户为设计中心

一、用户体验是什么 产品会与外界发生联系,人们如何去使用产品,人们使用产品无非解决两种问题,一,提高效率;二娱乐。而用户体验兼顾着功能和界面两个方面,为的是“提高人们的工作效率”...

铸剑为犁413
47分钟前
0
0
学习设计模式——代理模式

1. 认识代理模式 1. 定义:为其他对象提供一种代理以控制对这个对象的访问。 2. 组织结构: Proxy:代理对象,要实现与目标代理对象的相同的接口,这样就可以使用代理来代替具体的目标对象,...

江左煤郎
今天
1
0
java JDK动态代理

本篇随笔是对java动态代理中的JDK代理方式的具体实现。 首先需要定义一个接口,为其定义了两个方法:   public interface UserService { public void add(); public void delete(); } 然后需...

编程SHA
今天
2
0
轻松理解Dubbo分布式服务框架

Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的...

别打我会飞
今天
3
0
TypeScript基础入门之JSX(一)

转发 TypeScript基础入门之JSX(一) 介绍 JSX是一种可嵌入的类似XML的语法。 它旨在转换为有效的JavaScript,尽管该转换的语义是特定于实现的。 JSX在React框架中越来越受欢迎,但此后也看到了...

durban
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部