1. 程式人生 > >Android用註解代替findViewById和setContentView,註解入門

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宣告