Android用注解代替findViewById和setContentView,注解入门

看到一篇文章,用注解取代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));
         }
       }
     }
   }
 
代码很通俗易懂,一下子就可以让人学会注解。所以借鉴他的,我写了下,代替setContentView的注解

@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声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值