Android UI IoC注解加载控件

34 篇文章 0 订阅
Android UI IoC注解加载控件

知识点:注解 反射

接上篇 Android UI IoC注解加载布局

1. 业务Activity 和注解 InjectView
// 普通页面Activity代码,正常启动即可正常加载ioc_act.xml
@ContentView(R.layout.ioc_act)
public class IocAct extends BaseActivity {
    
    @InjectView(R.id.tv)
    private TextView tv;

    @Override
    protected void onResume() {
        super.onResume();
        // 也是通过注解加载tv(类ButterKnife原理)
        // TextView tv = findViewById(R.id.tv);
        Toast.makeText(this, tv.getText().toString(), Toast.LENGTH_SHORT)
        .show();
    }
}
// 该注解作用于属性
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
    int value();
}

2. 业务ioc_act.xml ,BaseActivity.java实现同上篇
3. InjectManager实现控件注入
public class InjectManager {

    public static void inject(Activity activity) {
        // 布局的注入
        injectLayout(activity);
        // 控件的注入
        injectViews(activity);
    }

    // 布局的注入
    private static void injectLayout(Activity activity) {
        ......
    }

    // 控件的注入
    private static void injectViews(Activity act) {
        // 获取类
        Class<? extends Activity> clazz = act.getClass();
        // 获取类的所有属性
        Field[] fields = clazz.getDeclaredFields();
        // 循环每个属性
        for (Field field : fields) {
            // 获得属性上的注解
            InjectView injectView = field.getAnnotation(InjectView.class);
            // 获取注解的值
            if (injectView != null) { // 并不是所有的属性都有注解
                int viewId = injectView.value();
                // 获取findViewById方法,并执行
                try {
                    Method method = clazz.getMethod("findViewById", int.class);
                    Object view = method.invoke(act, viewId);
                    // 另一种写法:
                    // view = activity.findViewById(viewId);
                    // 设置访问权限private
                    field.setAccessible(true);
                    field.set(act, view); // 属性的值赋给控件,在当前Activity
                } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

概括:其实上面几步就是ButterKnife的实现原理,免去大量findViewById之类的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初心一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值