Android 注解
相關文章:
Android AOP注解Annotation詳解(一)
Android AOP之注解處理解釋器詳解(二)
Android AOP 注解詳解及簡單使用實例(三)
一、簡介
在Android 里面 注解主要用來干這么幾件事:
二、Support Annotations栗子
這里使用官方的一個庫,說明在開發中的簡單一個應用。
2.1 導包
在新建項目的時候會自動導的,可以看build.gradle中的依賴dependencies是這樣的。
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.1.1' testCompile 'junit:junit:4.12'}如果沒有的話,自己在build.gradle的依賴添加(xx.x.x為你的compileSdkVersion版本號):
compile 'com.android.support:support-annotations:xx.x.x'
2.2 使用
這時候就可以使用一些support-annotations提供的注解,下面舉一些栗子:
1、 @NonNull
test方法參數添加了一個NonNull注解,然后我們傳遞一個空的參數過去。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String s = null; test(s); } public void test(@NonNull String s){ System.out.println(s); }}IDE就會提示警告

2、 @StringRes
再定義testString方法參數添加了一個StringRes注解,然后我們傳遞一個數字過去。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); testString(112312); testString(R.string.app_name); } public void testString(@StringRes int s){ System.out.println(s); }}IDE就會提示

三、實現自己的ButterKnife
經過之前的知識,我們已經知道注解的原理和使用了,這里實現ButterKnife的一個簡單功能,View的注入: 一個注解,一個解析器即可。
3.1 BindView注解
@Target(ElementType.FIELD) //解析常量@Retention(RetentionPolicy.RUNTIME) //運行時public @interface BindView { int value() default -1; //標識控件}3.2 BindViewParser解析器
/** * Created by Litp on 2017/2/17. */public class BindViewParser { /** * 傳遞activty或者View 對象,使用反射獲取view變量 * @param object */ public static void inject(Object object) { try { parse(object); } catch (Exception e) { e.printStackTrace(); } } /** * 解析獲取值 * @param object * @throws Exception */ public static void parse(Object object) throws Exception { final Class<?> clazz = object.getClass(); View view = null; //獲取clazz的變量,不論private還是public Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //這個變量 是否有BindView注解 if (field.isAnnotationPresent(BindView.class)) { //獲取這個變量對應的注解 BindView injectView = field.getAnnotation(BindView.class); //獲取值 int id = injectView.value(); if (id <= 0) { throw new Exception("View的id不能為空"); } else { //設置可以訪問 field.setAccessible(true); //獲取view if (object instanceof View) { view = ((View) object).findViewById(id); } else if (object instanceof Activity) { view = ((Activity) object).findViewById(id); } //設置View field.set(object, view); } } } }}3.3 Activity使用
public class MainActivity extends AppCompatActivity { //使用注解標識變量 @BindView(R.id.tv_test) TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //傳遞當前activty給解析器,進行初始化view BindViewParser.inject(this); //這里就已經是初始化完畢了,可以進行使用了 textView.setText("測試自己的注入demo"); }}感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答