最簡單的android annotation demo

最近了解到android annotation,其實技術點也並不多,只是平時寫應用的開發者接觸的並不多。這裏簡單的寫一個demo【findviewById】,用於理解,舉一反三。

ViewInject類

package com.simpleanswer.annotationdemo.view;

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 id() default -1;
}

AnnotationActivity 基類

package com.simpleanswer.annotationdemo;

import java.lang.reflect.Field;

import com.simpleanswer.annotationdemo.view.ViewInject;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class AnnotationActivity extends Activity {

@Override
public void setContentView(int layoutResID) {
    super.setContentView(layoutResID);
    autoInjectAllField(this);
}

public void autoInjectAllField(Activity activity)
{
  //得到Activity對應的Class
  Class clazz=this.getClass();
  //得到該Activity的所有字段
  Field[] fields=clazz.getDeclaredFields();
  for(Field field :fields)
  {
    //判斷字段是否標註ViewInject
    if(field.isAnnotationPresent(ViewInject.class))
    {
      //如果標註了,就獲得它的id
      ViewInject inject=field.getAnnotation(ViewInject.class);
      int id=inject.id();
      if(id>0)
      {
        //反射訪問私有成員,必須加上這句
        field.setAccessible(true);
        //然後對這個屬性複製
        try {
            field.set(activity, activity.findViewById(id));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
      }
    }
  }
}

}

MainActivity引用

package com.simpleanswer.annotationdemo;

import com.simpleanswer.annotationdemo.view.ViewInject;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AnnotationActivity {

@ViewInject(id=R.id.main_tv) TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv.setText("我愛這個世界!");
}

}

xml我就不貼了。源碼自行下載。

源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章