看到一篇文章,用注解取代fvb,https://www.2cto.com/kf/201405/302998.html
@Target
(ElementType.FIELD)
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
InjectView
{
//id就是控件id,在某一个控件上使用注解标注其id
int
id()
default
-
1
;
}
public
class
MainActivity
extends
Activity
{
public
static
final
String TAG=MainActivity;
//标注TextView的id
@InjectView
(id=R.id.tv_img)
private
TextView mText;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
autoInjectAllField(
this
);
}
catch
(IllegalAccessException e) {
}
catch
(IllegalArgumentException e) {
}
if
(mText!=
null
)
mText.setText(Hello Gavin);
}
public
void
autoInjectAllField(Activity activity)
throws
IllegalAccessException, IllegalArgumentException
{
//得到Activity对应的Class
Class clazz=
this
.getClass();
//得到该Activity的所有字段
Field []fields=clazz.getDeclaredFields();
Log.v(TAG, fields size-->+fields.length);
for
(Field field :fields)
{
//判断字段是否标注InjectView
if
(field.isAnnotationPresent(InjectView.
class
))
{
Log.v(TAG, is injectView);
//如果标注了,就获得它的id
InjectView inject=field.getAnnotation(InjectView.
class
);
int
id=inject.id();
Log.v(TAG, id--->+id);
if
(id>
0
)
{
//反射访问私有成员,必须加上这句
field.setAccessible(
true
);
//然后对这个属性复制
field.set(activity, activity.findViewById(id));
}
}
}
}
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface LayoutId { int id() default -1; }
@LayoutId(id = R.layout.activity_main) public class MainActivity extends AppCompatActivity { private static final String TAG = "xbh"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(this.getClass().getAnnotation(LayoutId.class).id()); } }之所以想这样做,就是为了在有base类的时候,看起来更加的清爽
子类
@LayoutId(id = R.layout.activity_main) public class MainActivity extends BaseActivity { }父类
@SuppressLint("Registered") public class BaseActivity extends AppCompatActivity{ private static final String TAG = "xbh"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(this.getClass().getAnnotation(LayoutId.class).id()); } }这样写,简直美的人心醉,啥都没有,就成功弄出了一个Activity。
解释下注解的定义
@Target(ElementType.TYPE)
注解的使用在什么地方主要是决定在@Targe这个元注解上作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明