Google出了个绑定数据到XML上的功能,不过目前实现有点麻烦。详情可以去android官网查看,爬不过墙的可以BAIDU一下 Android数据绑定 Data Binding等类似词语。

其实还有一种耗资源的实现方式,大家到可以试一下效果, 代码:

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)的控件,但是使用很方便。

另外还有一点药注意,对于实体类的写法要注意。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)Animation 框架
  5. textView 属性总结
  6. Android-Module:ImageView常用XML属性
  7. Android布局之baselineAligned属性
  8. Android开发小技巧集合(不断更新中)
  9. 相对布局

随机推荐

  1. react native 0.49 android版本热更新
  2. 如何在android地图中使用TextWatcher显示
  3. 如何从firebase中获取唯一ID内的数据
  4. 对APK进行解包和二次打包(Android)
  5. 数据未显示在Listview中
  6. Android 属性动画(Property Animation)
  7. ADT下搭建JNI编译环境
  8. Android 待机功能流程分析
  9. HTC One X的S720e采用了Beats Audio锁定
  10. Java已经启动,但是返回的退出代码=13 ecli