使用注释方式代替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应用提供的一种便捷的方式来使用注解,它简化了如依赖注入、界面生命周期管理、网络请求等多种常见任务。 1. **依赖注入(Dependency Injection)** Android Annotation支持...
10. **第三方库集成**:诸如Glide图片加载库、Retrofit网络请求库、ButterKnife注解绑定库等,实例会展示如何高效地集成和使用这些工具,提升开发效率。 通过这些实例,你不仅能学习到具体的编程技巧,还能了解最佳...
在Activity或Fragment中,可以通过`ActivityMainBinding`或`FragmentMainBinding`(根据布局文件名生成的类)来获取绑定实例,并设置数据模型: ```java ActivityMainBinding binding = DataBindingUtil....
3. 在Activity或Fragment中使用:在初始化视图时,只需调用`AnnotationBindingUtil.bind()`方法,传入根视图和目标对象(通常是当前类的实例),即可自动完成所有标记了注解的字段的绑定。 ```java @Override ...
`@Inject`注解在Android开发中是依赖注入的重要工具,它简化了UI控件的查找和绑定,提高了代码质量。理解并熟练使用注解和依赖注入框架,能够提升开发效率,使应用程序更具可扩展性和可维护性。在实际项目中,根据...
在Android应用开发中,网络请求和UI控件的动态修改是两个非常重要的环节。本实训主要探讨如何在Android环境中利用Java编程实现网络数据的获取,并将这些数据实时更新到用户界面上,提升用户体验。以下是对这两个核心...
在Android开发中,传统的UI创建方式通常涉及到XML布局文件的编写和Java代码的结合使用。然而,随着技术的发展,一种新的思路逐渐崭露头角,那就是利用JavaScript与Android Activity进行交互,实现动态、灵活的用户...
在传统的Android开发中,我们通常使用`LayoutInflater`来实例化布局,并通过`findViewById`方法查找并设置UI组件。`ViewUtils`提供了一种更简洁的方式,通过注解`@BindView`,可以直接在Activity或Fragment类中绑定...
然后在Activity中通过`addJavascriptInterface()`将这个类的实例绑定到WebView,设置一个唯一标识,供JavaScript调用。 3. **JavaScript调用Java方法** 在HTML页面的JavaScript代码中,可以通过`window对象`.`...
在Android编程领域,实例与项目开发案例是提升技能和理解平台特性的关键。"Android编程典型实例与项目开发案例源码"提供了丰富的实践资源,帮助开发者深入学习Android应用开发。这个压缩包包含了书籍中所有章节的源...
在Android开发中,数据绑定(Data Binding)是一个强大的框架,它允许开发者将界面UI元素直接绑定到应用的数据源,从而简化了代码,提高了可读性和维护性。本示例将详细解析如何在Android项目中使用Data Binding库,...
在这个"Android MVVM例子"中,MasteringAndroidDataBinding-master可能是示例项目的源码仓库,它可能包含了完整的MVVM+Databinding的实践案例,包括如何设置项目结构、编写ViewModel、处理数据交互、以及利用...
在Android中,注解通常用于简化依赖注入、简化UI绑定、数据验证等方面。 XUtils的注解机制主要包括以下几个方面: 1. **注入注解**:`@InjectView` 是XUtils提供的一个注解,用于自动绑定布局文件中的控件到...
ButterKnife是一款著名的Android视图绑定库,它通过注解简化了UI元素的绑定,使得开发者无需手动查找和设置视图。本Demo旨在仿照ButterKnife,实现一个编译时注解的实际运行案例,帮助开发者理解编译时注解的工作...
在实际应用中,`@ViewById`注解可以用来绑定XML布局文件中的UI元素,替代传统的`findViewById`方法。例如: ```java @EActivity(R.layout.activity_main) public class MyActivity extends AppCompatActivity { @...
Android在后台最小化的多线程下载程序实例,本下载实例定义了一个Handler,用于处理下载线程与UI间通讯,下载文件,参数:第一个URL,第二个存放路径。service 与activity 之间的消息通信 既是activity向service发...
在Android应用开发中,创建一个...这个过程涵盖了Android UI设计、数据绑定、适配器模式以及用户交互等核心知识点。随着技能的提升,你还可以进一步优化界面,如添加下拉刷新、异步加载图片等功能,使应用更加完善。
1. **UI界面设计**:Android提供了多种布局管理器,如LinearLayout、RelativeLayout、ConstraintLayout等,这些布局在实例中有着广泛的应用。你可以学习如何构建响应式、动态和美观的用户界面。 2. **事件处理**:...
BufferKnife是一个基于注解的视图绑定库,灵感来源于 ButterKnife,它极大地简化了Android中对UI元素的操作。在传统方式下,我们需要手动调用findViewById()方法来获取视图对象,这不仅增加了代码量,还容易出错。...
总的来说,"android天气实例"是一个综合性的学习案例,涵盖了Android开发中的多个重要概念:网络请求、JSON解析、UI设计和数据绑定。通过研究这个实例,开发者可以提升自己的Android技能,并了解到一个完整的天气...