通過註解可以減少很多重複的代碼。比如findviewById,seonclickListener等。
1.創建BindView註解(用於成員變量,在運行時存在)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
int value() default -1;
}
2.創建Click註解(用於方法,在運行時存在)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Click {
int value() default -1;
}
3.創建一個處理註解的靜態類
public class AnnocationUtils {
public static void analysisAnnocation(final Activity activity) {
Class clazz = activity.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(BindView.class)) {
BindView bindView = field.getAnnotation(BindView.class);
int id = bindView.value();
if (id > 0) {
field.setAccessible(true);
try {
field.set(activity, activity.findViewById(id));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
Method[] methods = clazz.getDeclaredMethods();
for (final Method method : methods) {
if (method.isAnnotationPresent(Click.class)) {
Click click = method.getAnnotation(Click.class);
int id = click.value();
if (id > 0) {
View view = activity.findViewById(id);
method.setAccessible(true);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
method.invoke(activity);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
}
主要的功能是:通過反射得到activity的成員變量和方法。再判斷成員變量和方法是否被註解過了,如果被註解過了,就獲取註解,得到id,判斷是否大於1,最後成員變量的執行設置屬性值(set),方法的執行方法(invoke)
在Activity中使用註解:
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
@BindView(R.id.btn_click1)
private Button btn_1;
@BindView(R.id.btn_click2)
private Button btn_2;
@BindView(R.id.btn_click3)
private Button btn_3;
int REQUEST_PERMISSION_CODE = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AnnocationUtils.analysisAnnocation(this);
btn_1.setText("我是按鈕1");
btn_2.setText("我是按鈕2");
btn_3.setText("我是按鈕3");
}
@Click(R.id.btn_click1)
private void onClick(){
Log.e(TAG,"我是按鈕11");
}
@Click(R.id.btn_click2)
public void onClick2(){
Log.e(TAG,"我是按鈕22");
}
@Click(R.id.btn_click3)
protected void onClick3(){
Log.e(TAG,"我是按鈕33");
}