`

android Activity注解方式获取UI实例 绑定事件

阅读更多

使用注释方式代替findVIewById 并绑定事件

示例:

package com.wf.test;

import com.wf.FindView;
import com.wf.R;
import com.wf.WfAndroidLibActivity;
import com.wf.R.layout;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class TestActivity extends WfAndroidLibActivity {
	
	
	 @FindView(id=R.id.btn1,click="btn1Click") //标注ID,绑定当前TestActivity的btn1Click方法
	 private Button btn1;
	 
	 //绑定 TestHandler中的 btn2Click方法
	 @FindView(id=R.id.btn2,click="btn2Click",className="com.wf.test.TestHandler")
	 private Button btn2;
	 
	 public void onCreate(Bundle savedInstanceState) {
	      super.onCreate(savedInstanceState);
	      this.setContentView(R.layout.main);
	      
	      btn1.setText("btn1  click"); //测试直接赋值
	      btn2.setText("btn2  click");
	      
	 }
	 public void doAction()
	 {
		 Log.d("test", "TestHandler call");
	 }
	 
	 public void btn1Click(View view){
		 ((Button)view).setText("click1");
		 Log.d("careland", "btn1---------click");
		 
	 }
}

 

package com.wf.test;



import com.wf.ViewContext;

import android.util.Log;
import android.view.View;
import android.widget.Button;

public class TestHandler{
	
	
	
	
	public void btn2Click(View view)
	{
		//获取btn1 
		Button btn1=(Button) ViewContext.getContext().get("btn1");
		Log.d("test", btn1.getText().toString());//获取btn1 的text
		
		
		//获取当前activity
		TestActivity act=(TestActivity) ViewContext.getContext().getCurrentActivity();
		act.doAction();
		
		((Button)view).setText("click2");
		Log.d("careland", "btn2 click");
	}
}

 实现源码:

package com.wf;

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


@Inherited
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FindView  {
	int id();
	String touch() default "";//touch事件
	String click() default ""; //onclick事件
	String dbclick() default "";
	String itemclick() default "";
	String longclick() default "";
	String className() default "";
	
}

 

package com.wf;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
//Activity 基类  注入基类 绑定事件
public class WfAndroidLibActivity extends Activity {
    /** Called when the activity is first created. */
	private String TAG="com.careland.WfAndroidLibActivity";

	private Button btn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
       
    }
    
    @Override 
    public void setContentView(View view)
    {
    	super.setContentView(view);
    	GetElement();
    }
    @Override 
    public void setContentView(int id)
    {
    	super.setContentView(id);
    	GetElement();
    }
    @Override 
    public void setContentView(View view,LayoutParams param)
    {
    	super.setContentView(view, param);
    	GetElement();
    }
    /**
     * 注入属性实例 绑定事件
     * **/
    protected void GetElement()
    {
    	 ViewContext<WfAndroidLibActivity> viewContext=new ViewContext<WfAndroidLibActivity>(this);
    	 ViewContext.setContext(viewContext);
    	 viewContext.GetElement(this);
    }
}

 

package com.wf;

import java.lang.reflect.Field;
import java.lang.reflect.Proxy;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;

//注释处理类
public class ViewContext<T> {

	private String TAG="com.careland.ViewUtil";
	private static ThreadLocal<ViewContext> context=new ThreadLocal<ViewContext>();
	
	private  T acitivity;
	private Map<String,Object> fields;//acitvity 中 所有属性
	
	public ViewContext(T acitivity)
	{
		this.acitivity=acitivity;
		fields=new HashMap<String,Object>();
	}
	//获取当前的Activity 
	public T getCurrentActivity()
	{
		return acitivity;
	}
	//保存 和获取 当前Activity的成员变量
	public Map<String,Object> getFields()
	{
		return fields;
	}
	public Object get(String key)
	{
		return fields.get(key);
	}
	public void put(String key,Object value)
	{
		fields.put(key, value);
	}
	
	public static boolean notNullOrEmpty(String value)
	{
		return value!=null&&(!"".equals(value.trim()));
	}
	
	public static ViewContext getContext()
	{
		return context.get();
	}
	public static void setContext(ViewContext ctx)
	{
	      context.set(ctx);
	}
	//解析注释   注入成员变量实例 绑定事件
	protected void HandlerAnnotation(Field field,Activity ctx)
	{
		
		FindView fv=field.getAnnotation(FindView.class);
		if(fv!=null)
		 {
			 int viewId=fv.id();
			 String className=fv.className();
			
			 try {
				field.setAccessible(true);
				View viewobj=ctx.findViewById(viewId);
				field.set(ctx, ctx.findViewById(viewId));
				this.put(field.getName(),viewobj);//
保存成员变量到Map				String touch=fv.touch();
				String click=fv.click();
				if(viewobj instanceof View)
				{
					View view=(View) viewobj;
					if(notNullOrEmpty(touch))
					{
						view.setOnTouchListener(new ViewEventHandler(ctx,touch,className));
					}
					if(notNullOrEmpty(click))
					{
						view.setOnClickListener(new ViewEventHandler(ctx,click,className));
					}
					
//					OnItemClickListener f = (OnItemClickListener) Proxy.newProxyInstance(OnItemClickListener.class.getClassLoader(),
//                            new Class[] { OnItemClickListener.class },
//                            handler);
					
					
				}
				
			 } catch (Exception e) {
				Log.d(TAG, "自动初始化View失败",e);
			 }
			 
		 }
	}
	
	
	
	public void GetElement(Activity ctx)
	{
		Field[] fields=ctx.getClass().getDeclaredFields();
		 for(Field field:fields)
		 {
			 this.HandlerAnnotation(field, ctx);
		 }
	}
}

 

package com.wf;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

//对各种事件的处理
public class ViewEventHandler implements OnClickListener, OnTouchListener,OnItemClickListener {

	private String TAG="com.wf.ViewHandler";
	private Object handler; //当前实例  默认activity 
	private String methodName; //要执行的目标方法 
	private String handlerClass;//要执行的目标类 
	public ViewEventHandler(Object handler, String method,String handlerClass) {
		this.handler=handler;
		this.methodName=method;
		this.handlerClass=handlerClass;
	}
	
	public ViewEventHandler(Object handler, String method) {
		this(handler,method,"");
	}
	/***
	 * touch 处理事件
	 * */
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		ReflectMethod method=new ReflectMethod(View.class,MotionEvent.class);
		return (Boolean) method.invoke(v,event);
	}
	/**
	 *  click处理事件
	 * **/
	@Override
	public void onClick(View v) {
		ReflectMethod method=new ReflectMethod(View.class);
	    method.invoke(v);
	}
	/**
	 * 执行itemClick事件
	 * */
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		ReflectMethod method=new ReflectMethod(AdapterView.class,View.class,Integer.class,Long.class);
		method.invoke(parent,view,position,id);
		
	}
	
	//调用目标方法类
	class ReflectMethod
	{
		public Object instance;
		public Method method=null;
		
		public ReflectMethod(Class... params)
		{
			if(!"".equals(handlerClass))
			{
				this.init(handlerClass, methodName, params);
			}else
			{
				this.init(handler, methodName, params);
			}
		}
		
		public ReflectMethod(Object instance,Method method)
		{
			this.instance=instance;
			this.method=method;
			
		}
		public Object invoke(Object... params) 
		{
			try {
				return method.invoke(instance, params);
			} catch (Exception e) {
				Log.e(TAG, ""+method.getName()+" error",e);
			}
			return null;
		}
		public void init(String className,String methodName,Class... params)
		{
			try {
				Class cls = Class.forName(className);
				this.instance=cls.newInstance();
				this.init(instance,methodName,params);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		public void init(Object instance,String methodName,Class... params)
		{
			try {
				this.instance=instance;
				this.method=instance.getClass().getDeclaredMethod(methodName,params);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	

	

}

 

分享到:
评论

相关推荐

    Android Annotation 安卓注解实例

    Android Annotation库则是专门为Android应用提供的一种便捷的方式来使用注解,它简化了如依赖注入、界面生命周期管理、网络请求等多种常见任务。 1. **依赖注入(Dependency Injection)** Android Annotation支持...

    Android上百实例源码

    10. **第三方库集成**:诸如Glide图片加载库、Retrofit网络请求库、ButterKnife注解绑定库等,实例会展示如何高效地集成和使用这些工具,提升开发效率。 通过这些实例,你不仅能学习到具体的编程技巧,还能了解最佳...

    Android数据绑定DataBinding

    在Activity或Fragment中,可以通过`ActivityMainBinding`或`FragmentMainBinding`(根据布局文件名生成的类)来获取绑定实例,并设置数据模型: ```java ActivityMainBinding binding = DataBindingUtil....

    用注解和反射写的一个绑定控件和点击事件的demo

    3. 在Activity或Fragment中使用:在初始化视图时,只需调用`AnnotationBindingUtil.bind()`方法,传入根视图和目标对象(通常是当前类的实例),即可自动完成所有标记了注解的字段的绑定。 ```java @Override ...

    Android使用注解查找控件

    `@Inject`注解在Android开发中是依赖注入的重要工具,它简化了UI控件的查找和绑定,提高了代码质量。理解并熟练使用注解和依赖注入框架,能够提升开发效率,使应用程序更具可扩展性和可维护性。在实际项目中,根据...

    android实训4 网络请求与ui控件修改

    在Android应用开发中,网络请求和UI控件的动态修改是两个非常重要的环节。本实训主要探讨如何在Android环境中利用Java编程实现网络数据的获取,并将这些数据实时更新到用户界面上,提升用户体验。以下是对这两个核心...

    Android创建UI的新思路:用javascript与Activity进行交互.zip

    在Android开发中,传统的UI创建方式通常涉及到XML布局文件的编写和Java代码的结合使用。然而,随着技术的发展,一种新的思路逐渐崭露头角,那就是利用JavaScript与Android Activity进行交互,实现动态、灵活的用户...

    Android-ViewUtils一个简单的注解框架功能包括布局绑定控件绑定控件的点击和长按事件

    在传统的Android开发中,我们通常使用`LayoutInflater`来实例化布局,并通过`findViewById`方法查找并设置UI组件。`ViewUtils`提供了一种更简洁的方式,通过注解`@BindView`,可以直接在Activity或Fragment类中绑定...

    安卓Android源码——创建UI的新思路:用javascript与Activity进行交互.rar

    然后在Activity中通过`addJavascriptInterface()`将这个类的实例绑定到WebView,设置一个唯一标识,供JavaScript调用。 3. **JavaScript调用Java方法** 在HTML页面的JavaScript代码中,可以通过`window对象`.`...

    Android编程典型实例与项目开发案例源码

    在Android编程领域,实例与项目开发案例是提升技能和理解平台特性的关键。"Android编程典型实例与项目开发案例源码"提供了丰富的实践资源,帮助开发者深入学习Android应用开发。这个压缩包包含了书籍中所有章节的源...

    android的数据绑定databinding示例

    在Android开发中,数据绑定(Data Binding)是一个强大的框架,它允许开发者将界面UI元素直接绑定到应用的数据源,从而简化了代码,提高了可读性和维护性。本示例将详细解析如何在Android项目中使用Data Binding库,...

    Android Mvvm例子

    在这个"Android MVVM例子"中,MasteringAndroidDataBinding-master可能是示例项目的源码仓库,它可能包含了完整的MVVM+Databinding的实践案例,包括如何设置项目结构、编写ViewModel、处理数据交互、以及利用...

    AndroidIOC获取注解(XUtils方式)实现Demo代码简单注解详细欢迎阅读.rar

    在Android中,注解通常用于简化依赖注入、简化UI绑定、数据验证等方面。 XUtils的注解机制主要包括以下几个方面: 1. **注入注解**:`@InjectView` 是XUtils提供的一个注解,用于自动绑定布局文件中的控件到...

    Android-Android中编译时注解实际运行Demo仿照ButterKnife来写的

    ButterKnife是一款著名的Android视图绑定库,它通过注解简化了UI元素的绑定,使得开发者无需手动查找和设置视图。本Demo旨在仿照ButterKnife,实现一个编译时注解的实际运行案例,帮助开发者理解编译时注解的工作...

    Android Annotations框架使用实例

    在实际应用中,`@ViewById`注解可以用来绑定XML布局文件中的UI元素,替代传统的`findViewById`方法。例如: ```java @EActivity(R.layout.activity_main) public class MyActivity extends AppCompatActivity { @...

    Android在后台最小化的多线程下载程序实例.rar

    Android在后台最小化的多线程下载程序实例,本下载实例定义了一个Handler,用于处理下载线程与UI间通讯,下载文件,参数:第一个URL,第二个存放路径。service 与activity 之间的消息通信 既是activity向service发...

    Android 上百实例源码 集合_1

    1. **UI界面设计**:Android提供了多种布局管理器,如LinearLayout、RelativeLayout、ConstraintLayout等,这些布局在实例中有着广泛的应用。你可以学习如何构建响应式、动态和美观的用户界面。 2. **事件处理**:...

    安卓单Activity demo和首页按钮切换demo,BufferKnife使用

    BufferKnife是一个基于注解的视图绑定库,灵感来源于 ButterKnife,它极大地简化了Android中对UI元素的操作。在传统方式下,我们需要手动调用findViewById()方法来获取视图对象,这不仅增加了代码量,还容易出错。...

    android天气实例

    总的来说,"android天气实例"是一个综合性的学习案例,涵盖了Android开发中的多个重要概念:网络请求、JSON解析、UI设计和数据绑定。通过研究这个实例,开发者可以提升自己的Android技能,并了解到一个完整的天气...

    android经典实例(从入门到精通)

    13. **第三方库**:许多优秀的第三方库如ButterKnife(注解绑定)、Glide(图片加载)、RxBinding(RxJava绑定)等,可以简化开发过程,提高效率。 14. **测试**:了解JUnit、Espresso等工具进行单元测试和UI测试,...

Global site tag (gtag.js) - Google Analytics