- 我们要到的效果如下代码:
/**
* 使用的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;