Android IOC 之 注解绑定控件 以及事件 事例 代码简单注释讲解

想必开发过android的都使用过一些 框架,然而框架里都会使用一些,注解来帮助我们,节省大量的代码开发量。同时也使代码更加的简洁。

但是注解是通过java反射来实现的当然可能会牺牲掉一些性能。

以下是本人写的一个较为简单的绑定控件,并且触发其OnclickListem 事件。

//直接先看下注解方法。比较简单,清晰

public class MainActivity extends FragmentActivity {

<span style="white-space:pre">	</span>//绑定对应的按钮控件,事件名称为<span style="font-family: Arial, Helvetica, sans-serif;">onClickCallback</span>

	@InjectView(id = R.id.button1, clickMethod = "onClickCallback")
	private Button Button1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		UIBindUtil.bind(this);//初始化绑定
	}

	@ClickMethod(R.id.button1)
	public void onClickCallback(View view) {//触发的事件
		Toast.makeText(MainActivity.this, "我是注解", 1).show();
	}

}

//接下来是绑定的初始化类

package com.ferris.ioc;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.app.Activity;
public class UIBindUtil {

	/**
	 * 绑定初始化各个空间的属性以及事件
	 * @param activity
	 */
	public static void bind(Activity activity) {
		Class<?> cl = activity.getClass();
		bindViews(activity, cl);
		bindMethods(activity, cl);
	}

	/**
	 *  为按钮绑定对应的事件方法
	 * @param activity
	 * @param cl
	 */
	private static void bindMethods(Activity activity, Class<?> cl) {
		for (Method method : cl.getDeclaredMethods()) {
			ClickMethod oc = method.getAnnotation(ClickMethod.class);
			if (oc != null) {
				int ids[] = oc.value();
				for (int id : ids) {
					OnEventListener listener = new OnEventListener(activity)
					.setmClick(id,method.getName());
					activity.findViewById(id).setOnClickListener(listener);
				}
			}
		}
	}
	/**
	 *  初始化按钮
	 * @param activity
	 * @param cl
	 */
	private static void bindViews(Activity activity, Class<?> cl) {
		try {
			for (Field field : cl.getDeclaredFields()) {
				InjectView av = field.getAnnotation(InjectView.class);
				if (av != null) {
					field.setAccessible(true);
					setView(field, activity, av.id());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void setView(Field view, Activity activity, int id)
			throws IllegalArgumentException, IllegalAccessException {
		view.set(activity, activity.findViewById(id));
	}

}

//点击方法的注入类

package com.ferris.ioc;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ClickMethod {
	int[] value() default {};
}

//绑定控件ID的注入类

package com.ferris.ioc;
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 InjectView {
    public int id();
    public String clickMethod() default ""; // 点击回调方法(方法参数必须只有一个View!)
}

//绑定方法事件触发管理类,管理类比较简单,我简单注释了下。相信看起来容易了

package com.ferris.ioc;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;

@SuppressLint("UseSparseArrays")
public class OnEventListener implements OnClickListener{
	private Activity activity;
	private static Map<Integer, String> listeners = new HashMap<Integer, String>(); //我们保存着控件ID以及方法名称的关联
	public OnEventListener(Activity activity) {
		// TODO Auto-generated constructor stub
		this.activity=activity;
	}

	public OnEventListener() {

	}

	public OnEventListener setmClick(Integer id,String name) {  //添加关联,并返回监听接口给View进行设置监听
		// TODO Auto-generated method stub
		listeners.put(id, name);
		return this;
	}

	@Override
	public void onClick(View v) {  //当有事件触发,则通过id去获取对应的方法,传递参数给方法触发对应的方法。即可
		// TODO Auto-generated method stub
		if(listeners==null||listeners.size()<=0){
			return;
		}

		String methodName=listeners.get(v.getId());
		if(TextUtils.isEmpty(methodName)){
			return;
		}
		  try {
			   //通过类去查找对应的方法以及参数类型
	            Method callbackMethod = activity.getClass().getDeclaredMethod(methodName, View.class);
	            callbackMethod.setAccessible(true);
	            //传递对应的参数过去
	            callbackMethod.invoke(activity, v);
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	}

}
时间: 2024-08-03 17:26:46

Android IOC 之 注解绑定控件 以及事件 事例 代码简单注释讲解的相关文章

android使用篇(四) 注解依赖注入IOC实现绑定控件

在android使用篇(三) MVC模式中提到一个问题: 1) 视图层(View):一般採用XML文件进行界面的描写叙述,使用的时候能够很方便的引入,可是用xml编写了,又须要在Acitvity声明而且实例化,有点麻烦,考虑是否能做一个类似注解实现匹配,或者写一个类获取xml的各个节点然后自己主动进行封装,当然,这仅仅是个想法,以后再实现. 今天最终把这个想法实现了,使用依赖注入IOC注解实现对activity中控件的实例化. 先普及一下java的反射机制和注解机制的知识: 下面引用大神的两篇文

Android注解式绑定控件,没你想象的那么难

Android开发中,有一个让人又爱又恨的方法叫findViewById(int);我想如果你是一民Android开发者,必然知道这个方法.那么为什么让人又爱又恨呢?想必大家也是很有感触.写一个布局,用Java代码写和用xml文件写,完成速度完全是无法比拟的.xml布局太方便了.同样的,想获取一个控件的对象,如果你是使用的xml布局文件写的布局,那么你必须调用findViewById()这个方法. TextView t = (TextView) findViewById(R.id.x); 这是我

在cocos2d-js实现自动绑定cocostudioUI控件与事件

一.起因 在客户端游戏开发中最让人恶心的工作就是UI相关的东西,虽然有了像cocostudio这样的可视化工具,但界面中有大量需要由代码访问的控件的时候,需要写太多重复的代码例如: //加载UI配置文件 var root = ccs.uiReader.widgetFromJsonFile("res/cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json"); this._mainNode.addChild(root); /

Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里都有

Android高效率编码-细节,控件.架包,功能.工具,开源汇总 事实上写博客的初衷也并非说什么分享技术,毕竟咱还仅仅是个小程序猿.最大的目的就是对自我的知识积累.以后万一编码的时候断片了,也能够翻出来看看,这样子对自己也有优点,所以今天就汇总一下一些须要的东西.多图来了,加油! 一.游戏 小熊打字,我刚接触电脑练习打字的时候用到的 下载地址:http://download.csdn.net/detail/qq_26787115/9365721 二.色彩 这张颜色表上的颜色都太赞了 三.控件 1

android - 自定义(组合)控件 + 自定义控件外观

转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观 Android自定义View实现很简单 继承View,重写构造函数.onDraw,(onMeasure)等函数. 如果自定义的View需要有自定义的属性,需要在values下建立attrs.xml.在其中定义你的属性. 在使用到自定义View的xml布局文件中需要加入xmlns:前缀="http://sc

Android学习笔记:常用控件 RadioGroup和CheckBox

RadioGroup和CheckBox是android的常用控件,本文自做简单介绍和学习笔记,所以所用的控件样式选用android默认的样式. 先看下代码实现的效果图 图中,上面两个(male和female)为一个RadioGroup中的两个RadioButton,下面三个为CheckBox. 一个RadioGroup里面的内容只可单选,CheckBox可多选. 接下来是代码部分 布局文件代码activity_main.xml : <LinearLayout xmlns:android="

Android开发笔记3之控件

一:编辑框 在res文件夹下的layout的文件夹的xml文件 这样在xml中我们就声明了两个控件,一个EditText和一个TextView <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren

Android控件onClick事件

Android控件onClick事件可以用如下三种方式来实现 1. 实现onClick方法 在layout的xml中指定onClick方法, Activity中实现该方法.  通常用于Button. File: res/layout/activity_main.xml <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height=&quo

【Android 初学】3、控件布局初步

什么是控件布局 所谓的控件布局方法,就是指控制控件在Activity当中的位置.大小.颜色以及其他控件样式属性的方法. 控件的布局,在android中,有两种方法: 1.使用布局文件完成控件布局(相对简单) 2.在Java代码中完成控件布局(动态布局.更灵活.也相对复杂) 布局方法分类 1.Linear Layout(最容易掌握) 线性布局:可以纵向布局.也可以横向布局. 2.Ralative Layout(最常用使用.熟悉WEB开发的人就很熟悉) 3.ListView 4.Grid View