Android 注解的方式绑定UI ID

注解的方式绑定UI的ID的原理还是通过反射来实现的,当然也需要我们能够自定义注解。


首先我们自定义一个注解类型ViewIngect.java

package com.example.testanotation.view.anotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解,绑定UI的Id
 * 	1.@Target表示需要注解的类型:
 * 		a.ElementType.TYPE:
 * 			类、接口、枚举类型
 * 		b.ElementType.FIELD:
 * 			属性
 * 		c.ElementType.METHOD:
 * 			方法
 * 		d.ElementType.PARAMETER:
 * 			参数
 * 		e.ElementType.CONSTRUCTOR:
 * 			构造函数
 * 		f.ElementType.LOCAL_VARIABLE:
 * 			局部变量
 * 		g.ElementType.ANNOTATION_TYPE:
 * 			注解类型
 * 		h.ElementType.PACKAGE:
 * 			包
 * 
 * 	2.@Retention表示注解保留的范围:
 * 		a.RetentionPolicy.SOURCE:
 * 			注解只在源码中有效
 * 		b.RetentionPolicy.CLASS:
 * 			注解在源码和class中有效,此为默认策略
 * 		c.RetentionPolicy.RUNTIME:
 * 			注解在源码、class文件和运行时都有效
 * 
 * @author Yanbao_Wu
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
	int value();
}
然后我们写一个Activity的基类进行发射的操作BaseActivity.java:

package com.example.testanotation.view.base;

import java.lang.reflect.Field;

import com.example.testanotation.view.anotation.ViewInject;

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

/**
 * Activity 基类,支持通过注解的方式绑定UI
 * 
 * @author Yanbao_Wu
 * @date: 2014-11-21
 */
public abstract class BaseActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(initLayoutId());
		injectViews();
	}
	
	/**
	 * 通过反射的方式将id绑定到加上注解的View
	 * 
	 * @author Yanbao_Wu
	 */
	protected void injectViews(){
		Field[] fields = this.getClass().getDeclaredFields();
		for (Field field : fields) {
			if (field.isAnnotationPresent(ViewInject.class)) {
				ViewInject inject = field.getAnnotation(ViewInject.class);
				int id = inject.value();
				
				if (id > 0) {
					field.setAccessible(true);
					try {
						field.set(this, this.findViewById(id));
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
	
	public abstract int initLayoutId();
}

现在就可以在我们的Activity中利用注解的方式绑定UI的ID了MainActivity.java:

package com.example.testanotation;

import com.example.testanotation.view.anotation.ViewInject;
import com.example.testanotation.view.base.BaseActivity;

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

public class MainActivity extends BaseActivity {
	
	@ViewInject(R.id.test_anotation)
	private TextView anotationText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 注解的方式成功绑定id,text将被设置,否则会抛出空指针异常
        anotationText.setText("Test Anotation");
    }

	@Override
	public int initLayoutId() {
		return R.layout.activity_main;
	}
}

以上就简单的实现了以注解的方式绑定ID了

你可能感兴趣的:(Android,框架)