目标的做法:Activity类上添加个注解,帮我们自动注入布局文科;声明View的时候,添加一行注解,然后自动帮我们findViewById;
于是乎我们的目标类是这样的:
@ContentView(value = R.layout.activity_main)
public class MainActivity extends BaseActivity
{
@ViewInject(R.id.id_btn)
private Button mBtn1;
@ViewInject(R.id.id_btn02)
private Button mBtn2;
3、编码
====
1、定义注解
首先我们需要两个注解文件:
package com.zhy.ioc.view.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView
{
int value();
}
ContentView用于在类上使用,主要用于标明该Activity需要使用的布局文件。
@ContentView(value = R.layout.activity_main)
public class MainActivity
package com.zhy.ioc.view.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject
{
int value();
}
在成员变量上使用,用于指定View的Id
@ViewInject(R.id.id_btn)
private Button mBtn1;
简单说一下注解:定义的关键字@interface ; @Target表示该注解可以用于什么地方,可能的类型TYPE(类),FIELD(成员变量),可能的类型:
public enum ElementType {
/**
- Class, interface or enum declaration.
*/
TYPE,
/**
- Field declaration.
*/
FIELD,
/**
- Method declaration.
*/
METHOD,
/**
- Parameter declaration.
*/
PARAMETER,
/**
- Constructor declaration.
*/
CONSTRUCTOR,
/**
- Local variable declaration.
*/
LOCAL_VARIABLE,
/**
- Annotation type declaration.
*/
ANNOTATION_TYPE,
/**
- Package declaration.
*/
PACKAGE
}
就是这些个枚举。
@Retention表示:表示需要在什么级别保存该注解信息;我们这里设置为运行时。
可能的类型:
public enum RetentionPolicy {
/**
- Annotation is only available in the source code.
*/
SOURCE,
/**
-
Annotation is available in the source code and in the class file, but not
-
at runtime. This is the default policy.
*/
CLASS,
/**
-
Annotation is available in the source code, the class file and is
-
available at runtime.
*/
RUNTIME
}
这些个枚举~
2、MainActivity
package com.zhy.zhy_xutils_test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.zhy.ioc.view.ViewInjectUtils;
import com.zhy.ioc.view.annotation.ContentView;
import com.zhy.ioc.view.annotation.ViewInject;
@ContentView(value = R.layout.activity_main)
public class MainActivity extends Activity implements OnClickListener
{
@ViewInject(R.id.id_btn)
private Button mBtn1;
@ViewInject(R.id.id_btn02)
private Button mBtn2;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ViewInjectUtils.inject(this);
mBtn1.setOnClickListener(this);
mBtn2.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.id_btn:
Toast.makeText(MainActivity.this, “Why do you click me ?”,
Toast.LENGTH_SHORT).show();
break;
case R.id.id_btn02:
Toast.makeText(MainActivity.this, “I am sleeping !!!”,
Toast.LENGTH_SHORT).show();
break;
}
}
}
注解都写好了,核心的代码就是ViewInjectUtils.inject(this)了~
3、ViewInjectUtils
1、首先是注入主布局文件的代码:
/**
-
注入主布局文件
-
@param activity
*/
private static void injectContentView(Activity activity)
{
Class<? extends Activity> clazz = activity.getClass();
// 查询类上是否存在ContentView注解
ContentView contentView = clazz.getAnnotation(ContentView.class);
if (contentView != null)// 存在
{
int contentViewLayoutId = contentView.value();
try
{
Method method = clazz.getMethod(METHOD_SET_CONTENTVIEW,
int.class);
method.setAccessible(true);
method.invoke(activity, contentViewLayoutId);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
通过传入的activity对象,获得它的Class类型,判断是否写了ContentView这个注解,如果写了,读取它的value,然后得到setContentView这个方法,使用invoke进行调用;
最后
下面是辛苦给大家整理的学习路线
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
METHOD_SET_CONTENTVIEW,
int.class);
method.setAccessible(true);
method.invoke(activity, contentViewLayoutId);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
通过传入的activity对象,获得它的Class类型,判断是否写了ContentView这个注解,如果写了,读取它的value,然后得到setContentView这个方法,使用invoke进行调用;
最后
下面是辛苦给大家整理的学习路线
[外链图片转存中…(img-kBJNB4nG-1714645209782)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!