使用註解解放View的findViewbyId和setOnclickListener

通過註解可以減少很多重複的代碼。比如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");
    }

 

 

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