Android注解学习第二步,初探注解,注解view

  1. 我们要到的效果如下代码:
    /**
 * 使用的Xutils框架进行的注解使用
 */
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

    @ViewInject(R.id.button)
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
       ViewInJectImpl.viewInJect(this);
    }
}

实现ContentView注解的方法步骤:
1.尽量来进行标准的文件夹及文件的命名,如下图:
目录结构的截图

2.在annotations文件夹下创建ContentView,代码如下:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
*@Target 元注解,表示该注解可以用于什么地方,
*@Retention 元注解,表示需要在什么级别保存该注解信息,
*@interface  元注解,表示该注解使用时的注解名称,
*ElementType.TYPE  注解的类型为类,接口,或者枚举类型
*RetentionPolicy.RUNTIME   运行时注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
    int value();
}

3.进行相应的功能注解,这里是setContentView和findViewById的反射使用

public class ViewInJectImpl {

    /**
     * 注解setContextView
     *
     * @param activity
     */
    public static void viewInJect(Activity activity) {
        Class<? extends Activity> activityClass = activity.getClass();
        ContentView contextView = activityClass.getAnnotation(ContentView.class);
        if (contextView != null) {
            int contentViewLayoutId = contextView.value();
            try {
                Method setContentView = activityClass.getMethod("setContentView", int.class);
                setContentView.setAccessible(true);
                setContentView.invoke(activity, contentViewLayoutId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 注释findViewById
     */
    public static void findViewInJect(Activity activity) {
        Class<? extends Activity> aClass = activity.getClass();
//        ViewInject viewInject = aClass.getAnnotation(ViewInject.class);
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            ViewInject annotation = field.getAnnotation(ViewInject.class);
            if (annotation != null) {
                int value = annotation.value();
                if (value != -1) {
                    try {
                        Method findViewById = aClass.getMethod("findViewById", int.class);
                        findViewById.setAccessible(true);
                        findViewById.invoke(activity, value);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

此处只是个人的学习记录,如果想了解学习请看大神的博客:http://blog.csdn.net/lmj623565791/article/details/39269193

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值