反射实现ViewInject

2018-09-18  本文已影响0人  飞奔吧牛牛
能实现自动给控件赋值的库包括xutils和butterknife等。前几天复习了下反射,想自己实现类似的功能。水平有限,简单一个方法,供大家参考。
思路

1.获取activity的所有属性,
2.检查属性是否有Inject这样一个注解,
3.有,获取注解中的id,
4.通过activity.findViewById(id)找到该View,赋值给该属性。

自定义注解类Inject:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Inject {

    int value();
}

注解工具类


public class ViewInject {

    public static void inject(Activity activity) {
        Class<? extends Activity> aClass = activity.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();//1.获取activity的所有属性,
        for (int i = 0; i < declaredFields.length; i++) {
            Field declaredField = declaredFields[i];
            Inject inject = declaredField.getAnnotation(Inject.class);//2.检查属性是否有Inject这样一个注解。
            if (inject != null) {//3.有
                int id = inject.value();//3.获取注解中的id
                View view = activity.findViewById(id);//4.找到该View
                try {
                    if (!declaredField.isAccessible()) {
                        declaredField.setAccessible(true);
                    }
                    declaredField.set(activity, view);//4.赋值给该属性
                } catch (Exception e) {
                    throw new RuntimeException("type cast exception");
                }
            }
        }
    }
}

在Activity中使用

public class MainActivity extends AppCompatActivity {
    @Inject(R.id.tv)
    private TextView textView;
    @Inject(value = R.id.tv2)
    private TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewInject.inject(this);
        textView.setText("abc");
        textView2.setText("你好");
    }

}

使用该方法实现了自动给控件赋值的功能。

上一篇下一篇

猜你喜欢

热点阅读