您的位置:首页 > 移动开发 > Android开发

Android 绑定数据到界面控件

2015-12-30 21:29 423 查看
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)的控件,但是使用很方便。

另外还有一点药注意,对于实体类的写法要注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: