IoC之手写运行时注入点击事件

系列文章

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() {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值