最近在github上看到一个很好Android端IOC框架,觉得十分小巧方便,用起来的非常简单,因此推荐给大家,主人十分勤奋,一有时间就更新框架,励志让安卓开发以后变得超级简单,用代码改变世界。希望大家能支持,多多给星
github传送门:https://github.com/JackWHLiu/jackknife
一、关于如何配置环境
如果要依赖jackknife的库,需要对号入座的加上以下两个配置。
//指定仓库的地址,在project的build.gradle加入加粗的代码。
allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } }
//依赖本库,在app模块的build.gradle加入加粗的代码。
dependencies { compile 'com.github.JackWHLiu:jackknife:1.0.0' }
二、关于如何使用(参考官网http://www.jackwhliu.cn/jackknife/)
(一)基于IOC的自动注入视图、绑定控件和注册事件(jackknife-ioc)
1、自动注入视图
(1)Activity继承com.lwh.jackknife.app.Activity,Fragment继承com.lwh.jackknife.app.Fragment
(2)保证布局的xml文件和Activity和Fragment的Java类的命名遵循一定的对应关系(Java类名必须以Activity或Fragment结尾)。
具体关系如下: 前缀+名字 例如:MainActivity.java映射的xml文件名就为activity_main.xml,TTSFragment.java映射的xml文件名就为fragment_t_t_s.xml。 Java文件以大写字母分隔单词,xml以下划线分隔单词。
2、自动绑定控件
(1)不加注解
直接在Activity或Fragment声明控件(View及其子类)为成员变量,不加任何注解。它会以这个View的名字来绑定该控件在xml中的id的value,即@+id/后指定的内容。
(2)加@ViewId
优先级比不加注解高,简单的说,加上这个注解就不会使用默认的使用成员属性名来对应xml的控件id的方式,而是使用该注解指定的id与xml的控件id绑定。
例如:
@ViewId(R.id.alertDialog_et) EditText alertDialog_et;
(3)加@ViewIgnore
优先级最高,加上该注解,jackknife会直接跳过该控件的自动注入。一般使用在使用Java代码new出来的控件提取到全局的情况。
@ViewIgnore//此注解用在使用代码new出来的View TextView mTipsTextView;
(4)加onClick点击事件
@OnClick(R.id.button_ioc_plus) public void plus(View view) { mCountTextView.setText(++mCurrent+""); mTipsTextView = new TextView(this); mTipsTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); mTipsTextView.setText("继续点击,直到点不到我为止"); linearlayout_ioc_root.addView(mTipsTextView, 1); }多个onClick点击事件,只需分号隔开就好
@OnClick({ R.id.relativelayout_logger, R.id.relativelayout_toastutils, R.id.relativelayout_basemodel, R.id.relativelayout_ioc, R.id.relativelayout_commonadapter, R.id.relativelayout_mvp, R.id.relativelayout_orm, R.id.relativelayout_shadeview, R.id.relativelayout_horizontaltabbar, R.id.relativelayout_multiradiogroup, R.id.relativelayout_letterview })
public void onMenuItemClick(View view) { Intent intent = new Intent(); switch (view.getId()) { case R.id.relativelayout_logger: intent.setClass(this, LoggerActivity.class); break; case R.id.relativelayout_toastutils: intent.setClass(this, ToastActivity.class); break; case R.id.relativelayout_basemodel: intent.setClass(this, BaseModelActivity.class); break; case R.id.relativelayout_ioc: intent.setClass(this, IocActivity.class); break; case R.id.relativelayout_commonadapter: intent.setClass(this, CommonAdapterActivity.class); break; case R.id.relativelayout_mvp: intent.setClass(this, ArticleActivity.class); break; case R.id.relativelayout_orm: intent.setClass(this, OrmActivity.class); break; case R.id.relativelayout_shadeview: intent.setClass(this, ShadeViewActivity.class); break; case R.id.relativelayout_horizontaltabbar: intent.setClass(this, HorizontalTabBarActivity.class); break; case R.id.relativelayout_multiradiogroup: intent.setClass(this, MultiRadioGroupActivity.class); break; case R.id.relativelayout_letterview: intent.setClass(this, LetterViewActivity.class); break; } startActivity(intent);}
5.基于Java动态代理的ioc事件自动注册,自动调用listenerSetter指定的方法
/**
* 基于Java动态代理的ioc事件自动注册,自动调用listenerSetter指定的方法,传入的回调方法是listenerType指定的类
* 型的callbackMethod指定的方法,真正回调的是使用了本注解的方法。需要注意的是,代理方法与被代理方法的参数列表必
* 须保持一致。
*
* @auther lwh
* @see TitleBar#setOnRightClickListener(TitleBar.OnRightClickListener)
* @see TitleBar.OnRightClickListener#onClick(View)
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@EventBase(listenerSetter = "setOnRightClickListener",
listenerType = TitleBar.OnRightClickListener.class,
callbackMethod = "onClick")
public @interface OnRight {
int[] value();
}
* 基于Java动态代理的ioc事件自动注册,自动调用listenerSetter指定的方法,传入的回调方法是listenerType指定的类
* 型的callbackMethod指定的方法,真正回调的是使用了本注解的方法。需要注意的是,代理方法与被代理方法的参数列表必
* 须保持一致。
*
* @auther lwh
* @see TitleBar#setOnRightClickListener(TitleBar.OnRightClickListener)
* @see TitleBar.OnRightClickListener#onClick(View)
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@EventBase(listenerSetter = "setOnRightClickListener",
listenerType = TitleBar.OnRightClickListener.class,
callbackMethod = "onClick")
public @interface OnRight {
int[] value();
}