最近了解到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我就不貼了。源碼自行下載。