系列文章
IoC之手写运行时注入布局
IoC之手写运行时注入控件
IoC之手写运行时注入点击事件
IoC之手写运行时注入通用事件
常规写法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
所谓运行时注解,就是在代码中没有写setContentView(xxx),而是在运行的时候调用的。
运行时注入
首先我们需要一个注解,用来获取注入布局的id
@Target(ElementType.TYPE) // 注解作用域到 类上
// @Retention(RetentionPolicy.CLASS) // 编译时期
@Retention(RetentionPolicy.RUNTIME) // 运行时期
public @interface ContentView {
int value() default -1;
}
然后我们使用一个工具类,来解析这个注解,并且通过反射调用setContentView方法。
/**
* 把布局注入到 Activity中去
* @param object == MainActivity
*/
private static void injectSetContentView(Object object) {
Class<?> mMainActivityClass = object.getClass();
// 拿到MainActivity里面的(ContentView)注解
ContentView mContentView = mMainActivityClass.getAnnotation(ContentView.class);
if (null == mContentView) {
Log.d(TAG, "ContentView is null ");
return;
}
// 拿到用户设置的布局ID
int layoutID = mContentView.value();
// 我们需要执行 setContentView(R.layout.activity_main); 把布局注入到Activity
try {
Method setContentViewMethod = mMainActivityClass.getMethod("setContentView", int.class);
setContentViewMethod.invoke(object, layoutID);
} catch (Exception e) {
e.printStackTrace();
}
}
最后在Activity中调用即可
@ContentView(R.layout.activity_main) // 5415151
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
InjectTool.inject(this);
}
}