Android注解式绑定控件BindView

转载请注明 出处:http://blog.csdn.net/u012975705/article/details/49637401
Android注解式绑定控件BindView

BindView.java

package com.practice.noyet.coolweather.util;

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 BindView {
    int id();
    boolean click() default false;
}

AnnotateUtil.java

package com.practice.noyet.coolweather.util;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.util.Log;
import android.view.View;

import java.lang.reflect.Field;

public class AnnotateUtil {
    public AnnotateUtil() {
    }

    public static void initBindView(Object currentClass, View sourceView) {
        Field[] fields = currentClass.getClass().getDeclaredFields();
        if(fields != null && fields.length > 0) {
            Field[] var6 = fields;
            int var5 = fields.length;

            for(int var4 = 0; var4 < var5; ++var4) {
                Field field = var6[var4];
                BindView bindView = (BindView)field.getAnnotation(BindView.class);
                if(bindView != null) {
                    int viewId = bindView.id();
                    boolean clickLis = bindView.click();

                    try {
                        field.setAccessible(true);
                        if(clickLis) {
                            sourceView.findViewById(viewId).setOnClickListener((View.OnClickListener)currentClass);
                        }

                        field.set(currentClass, sourceView.findViewById(viewId));
                    } catch (Exception var11) {
                        var11.printStackTrace();
                    }
                }
            }
        }

    }

    public static void initBindView(Activity aty) {
        initBindView(aty, aty.getWindow().getDecorView());
    }

    public static void initBindView(View view) {
        Context cxt = view.getContext();
        if(cxt instanceof Activity) {
            initBindView((Activity)cxt);
        } else {
            Log.d("AnnotateUtil.java", "the view don\'t have root view");
        }
    }

    @TargetApi(11)
    public static void initBindView(Fragment frag) {
        initBindView(frag, frag.getActivity().getWindow().getDecorView());
    }
}

使用方式

Activity、Fragment中:

 @BindView(id = R.id.headerlayout)
 private HeaderLayout headerLayout;

 @Override
 protected void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(R.layout.acitvity_weather);

     AnnotateUtil.initBindView(this);
 }

Adapter的ViewHolder中:

package com.practice.noyet.coolweather.adapter;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.practice.noyet.coolweather.model.County;
import com.practice.noyet.coolweather.util.AnnotateUtil;
import com.practice.noyet.coolweather.util.BindView;

public class SpinnerArrayAdapter extends SpinnerAdapter {

    public SpinnerArrayAdapter(Context context) {
        super(context);
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        Holder holder;
        if (view == null) {
            view = mInflater.inflate(android.R.layout.simple_list_item_1, null);
            holder = new Holder(view);
            view.setTag(holder);
        } else {
            holder = (Holder) view.getTag();
        }

        County county = (County) getItem(position);
        holder.textView.setText(county.getCountyName());
        return view;
    }

    private class Holder {

        @BindView(id = android.R.id.text1)
        public TextView textView;

        public Holder(View view) {
            AnnotateUtil.initBindView(this, view);
        }
    }
}

SpinnerAdapter详见:http://blog.csdn.net/u012975705/article/details/48471835

对已自定义View的使用方式

initBindView(view)

你可能感兴趣的:(Android笔记,android初级进阶)