Android 绑定数据到界面控件
2015-12-30 21:29
423 查看
Google出了个绑定数据到XML上的功能,不过目前实现有点麻烦。详情可以去android官网查看,爬不过墙的可以BAIDU一下 Android数据绑定 Data Binding等类似词语。
其实还有一种耗资源的实现方式,大家到可以试一下效果, 代码:
这个方法是我参照别人写的东西做了相应改动,适合自己使用。
里面的控件命名规则我有说明,至于方法里面的实现方式我不再多说。
这个方法的弊端就是要扫描整个root(自己指定的View)的控件,但是使用很方便。
另外还有一点药注意,对于实体类的写法要注意。
其实还有一种耗资源的实现方式,大家到可以试一下效果, 代码:
import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.TextView; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Created by anykaa on 15/10/29. */ public class BindingData { /** * 绑定对应属性值到TextView和EditText控件上 * 规则: * TextView控件, myProperty-->txt_myProperty * EditText控件, myProperty-->etxt_myProperty * * @param root * @param bean */ public static void bind(View root, Object bean) { if (root == null || bean == null) { return; } if (root instanceof ViewGroup) { View child; String tmp = null; Object arg = null; for (int i = 0; i < ((ViewGroup) root).getChildCount(); i++) { child = ((ViewGroup) root).getChildAt(i); if (child instanceof TextView) { try { tmp = child.getResources().getResourceName(child.getId()); } catch (Exception ex) { LogEnrising.i("发现没有设置id属性的TextView控件"); continue; } tmp = tmp.substring(tmp.indexOf("/") + 1); Field[] fields = bean.getClass().getDeclaredFields(); for (Field field : fields) { if (tmp.equals("txt_" + field.getName())) { field.setAccessible(true); try { if (field.getGenericType().toString().equals( "class java.lang.String") || field.getGenericType().toString().equals( "class java.lang.Double") || field.getGenericType().toString().equals( "class java.lang.Integer") || field.getGenericType().toString().equals( "class java.lang.Short")) { Method m = (Method) bean.getClass().getMethod( "get" + getMethodName(field.getName())); arg = m.invoke(bean);// 调用getter方法获取属性值 } } catch (Exception ee) { LogEnrising.i("反射取值出错:" + field.getName()); } ((TextView) child).setText(String.valueOf(arg)); break; } } } else if (child instanceof EditText) { try { tmp = child.getResources().getResourceName(child.getId()); } catch (Exception ex) { LogEnrising.i("发现没有设置id属性的EditText控件"); continue; } tmp = tmp.substring(tmp.indexOf("/") + 1); Field[] fields = bean.getClass().getDeclaredFields(); for (Field field : fields) { if (tmp.equals("etxt_" + field.getName())) { field.setAccessible(true); try { if (field.getGenericType().toString().equals( "class java.lang.String") || field.getGenericType().toString().equals( "class java.lang.Double") || field.getGenericType().toString().equals( "class java.lang.Integer") || field.getGenericType().toString().equals( "class java.lang.Short")) { Method m = (Method) bean.getClass().getMethod( "get" + getMethodName(field.getName())); arg = m.invoke(bean);// 调用getter方法获取属性值 } } catch (Exception ee) { LogEnrising.i("反射取值出错:" + field.getName()); } ((EditText) child).setText(String.valueOf(arg)); break; } } } else if (child instanceof ViewGroup) { bind(child, bean); } } } else { } } // 把一个字符串的第一个字母大写、效率是最高的、 private static String getMethodName(String fildeName) throws Exception { byte[] items = fildeName.getBytes(); items[0] = (byte) ((char) items[0] - 'a' + 'A'); return new String(items); } }
这个方法是我参照别人写的东西做了相应改动,适合自己使用。
里面的控件命名规则我有说明,至于方法里面的实现方式我不再多说。
这个方法的弊端就是要扫描整个root(自己指定的View)的控件,但是使用很方便。
另外还有一点药注意,对于实体类的写法要注意。
相关文章推荐
- Android 自定义控件3
- Android自定义控件2
- android启动界面和引导界面的动画
- android中引入外部字体
- Android 自定义控件1
- Android 反射获得控件对象
- 【Android实战】图片选取、拍摄、裁剪、上传
- android官方文档Training引导
- Android Studio 多渠道打包中针对不同渠道不同应用名称的处理方法
- Android测试之Monkey
- Android的Service服务的基本的介绍
- Android-Displaying Bitmaps Efficiently
- Android 获取手机系统的声音设置管理通知提醒的声音
- 【android学习1】:安装MySQL启动服务失败解决方法
- Android Toast防止重复显示的方法
- Android 滑动页面的实现,ViewPager使用详解
- android阅读器里的 txt 文本处理分页功能的实现:
- Android 启动 Activity和一键退出应用的的最佳方法
- android RecyclerView
- Android Support Design Library之NavigationView