系列文章
IoC之手写运行时注入布局
IoC之手写运行时注入控件
IoC之手写运行时注入点击事件
IoC之手写运行时注入通用事件
废话不多说,先写一个注解
@Target(ElementType.METHOD) // 作用域在方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时期
public @interface Click {
int value();
}
然后写处理这个注解的方法
/**
* 把布局里面的控件ID 和 Activity方法绑定起来,建立事件
* @param object == MainActivity
*/
private static void injectClick(final Object object) {
Class<?> mainActivityClass = object.getClass();
// 遍历MainActivity所有的方法
Method[] declaredMethods = mainActivityClass.getDeclaredMethods();
for (final Method declaredMethod : declaredMethods) { // ... private void show() {} onCreate test111 test222
declaredMethod.setAccessible(true);
Click click = declaredMethod.getAnnotation(Click.class);
if (click == null) {
Log.d(TAG, "Click == null ");
continue;
}
// get R.id.bt_test3
int viewID = click.value();
try {
Method findViewByIdMethod = mainActivityClass.getMethod("findViewById", int.class);
Object resultView = findViewByIdMethod.invoke(object, viewID); // findViewById(viewID);
View view = (View) resultView; // View view = findViewById(viewID == R.id.bt_test3);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 执行此方法 private void show() {}
// declaredMethod == show
try {
declaredMethod.invoke(object);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
统一到一个方法中
public class InjectTool {
private static final String TAG = InjectTool.class.getSimpleName();
public static void inject(Object object) {
injectSetContentView(object);
injectBindView(object);
injectClick(object);
}
}
在Activity中使用
@ContentView(R.layout.activity_main) // 5415151
public class MainActivity extends AppCompatActivity {
@BindView(R.id.bt_test1)
Button button1;
TextView textView;
String string;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
InjectTool.inject(this);
Log.d("MainActivity", "onCreate: " + button1.getText().toString());
}
@Click(R.id.bt_test3)
private void show() {
Toast.makeText(this, "show is run", Toast.LENGTH_SHORT).show();
}
private void test111() {
}
private void test222() {
}
}