文档章节

为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
海淀
程序员
私信 提问
Spring for Android 将 Spring 引到 Android 上

近日,SpringSource发布了Spring for Android 1.0。Spring for Android是Spring Framework的扩展,有助于简化原生Android应用的开发。此次发布最为引入关注之处是提供了一个REST客户端(Res...

墙头草
2012/07/09
4.5K
4
当Dagger2撞上ViewModel,一种更简单的注入方式

简书地址:www.jianshu.com/p/d3c43b9dd… 写在前面 过去一年多的时间里,我一直在致力于打造一个最简单,并能让普通Android开发者都能快速上手的框架,并陆续发表了多篇开发心得,最终汇总为...

ditclear
12/03
0
0
当Dagger2遇上ViewModel

写在前面 过去一年多的时间里,我一直在致力于打造一个最简单,并能让普通Android开发者都能快速上手的框架,并陆续发表了多篇开发心得,最终汇总为了《使用Kotlin构建MVVM应用程序》系列文章...

ditclear
12/01
0
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

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
5
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
3
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
4
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部