文档章节

为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应用的人群。 Dagg...

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

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

泽毛
04/11
0
0
使用Kotlin构建MVVM应用程序—第四部分:依赖注入Dagger2

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

ditclear
05/13
0
0
android-swipelistview的开源项目的配置

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

金馆长
2013/10/17
0
0
android项目两种构建方式的整合(Eclipse/idea和Android Studio)

github文章备份,获得更好的阅读体验 android的两种构建方式 目前android主要有两种构建方式,一种基于ant(传统的),另一种是13年Google/IO上新推出基于Gralde的构建(Android Studio)。从...

龙凯
2014/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

git +STS使用问题解决一

1. 2.点以一个pull就是更新代码 3.synchronize workSpace 同步代码,同SVN一致

森火
10分钟前
0
0
powerBi odbc 连接impala 实现自助分析

配置Impala以使用ODBC 可以将第三方产品设计为使用ODBC与Impala集成。为获得最佳体验,请确保支持您打算使用的任何第三方产品。验证支持包括检查Impala,ODBC,操作系统和第三方产品的版本是...

hblt-j
14分钟前
0
0
Purism FAQ

<font size="37" color="#006248" face="幼圆"> <p align="center"> Purism FAQ </p> </font> 原文:https://puri.sm/faq/ 原作者:Purism Team 翻译者:冰焰火灵X 1079092922@qq.com 文章许......

ICE冰焰火灵X
30分钟前
0
0
nginx+webdav

1、配置Nginx以支持WebDav: Webdav是nginx一个组件,默认编译nginx时是没有安装这个组件的。 如果跟应用公用一个nginx,需要重新编译安装nginx,重新安装前需要备份好原来的nginx.conf。 1....

yaukie
36分钟前
0
0
spring 事件

ContextRefreshedEvent Event raised when an {@code ApplicationContext} gets initialized or refreshed. ContextClosedEvent Event raised when an {@code ApplicationContext} gets clos......

Canaan_
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部