为Android引入依赖注入
为Android引入依赖注入
renhaixyz 发表于4年前
为Android引入依赖注入
  • 发表于 4年前
  • 阅读 447
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 放弃一大堆的findViewById吧,你有更好的选择

在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

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

共有 人打赏支持
粉丝 2
博文 2
码字总数 474
×
renhaixyz
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: