目的:检查界面上所有的可输入控件都由用户输入了值。
控件较多,懒得一个一个地findViewById的方式来检查,想通过遍历界面上的控件的方式来实现。
但是,为啥可以获得id,但就是不能获取用户输入的值呢?
难道通过inflater获取到的只是同一个layout的新的实例???
求解啊?
暂时我只好把所有的R.id.xxx事先放到一个数组里,再一个一个地findViewById了。private boolean checkForm(int layoutId) {
//RelativeLayout layout = (RelativeLayout) getLayoutInflater().inflate(layoutId, null);
RelativeLayout layout = (RelativeLayout)LayoutInflater.from(this).inflate(layoutId, null);
layout = (RelativeLayout)findViewById(R.id.widget36);
boolean flag = true; for (int i = 0; flag && i < layout.getChildCount(); i++) {
View v = layout.getChildAt(i);
// Log.v("ID",v.getClass().getName().toString() + "," + v.getId());
flag = checkView(v);
}
return flag;
} private boolean checkView(View v) {
boolean flag = true;
//! 为什么所有的控件都取不到值 !!!
Log.v("check", v.getClass().getName().toString() + "," + v.getId()); if ((v instanceof ImageView) || (v instanceof TextView)) {
return true;
} else if (v instanceof EditText) {
// Log.v("test", v.getId() + "EditText="
// +((EditText)v).getText().toString());
// if (((EditText) v).getText().toString().equals("")) {
// Log.v("return", v.getClass().toString());
// return false;
// }
EditText e = (EditText) findViewById(v.getId());
Log.v("test", "editText=" + e.getText().toString());
return true;
} else if (v instanceof Spinner) {
// Log.v("return",(((Spinner)v).getSelectedItemId() ==
// AdapterView.INVALID_ROW_ID) + "");
if (((Spinner) v).getSelectedItem() == null) {
Log.v("return", v.getClass().toString());
// ! SO DOES Spinner!!! CANNOT getValue!!
// return false;
return true;
}
} else if (v instanceof RadioGroup) {
if (((RadioGroup) v).getCheckedRadioButtonId() == -1) {
// Log.v("return", v.getClass().toString() + "," +
// ((RadioGroup)v).getCheckedRadioButtonId());
// ? return false;
return true;
}
} else if (v instanceof ViewGroup) {
Log.v("Recurve", v.getClass().toString());
for (int i = 0; flag && i < ((ViewGroup) v).getChildCount(); i++) {
View vx = ((ViewGroup) v).getChildAt(i);
flag = checkView(vx);
}
return flag;
}
Log.v("return2", v.getClass().toString());
return true;
}
控件较多,懒得一个一个地findViewById的方式来检查,想通过遍历界面上的控件的方式来实现。
但是,为啥可以获得id,但就是不能获取用户输入的值呢?
难道通过inflater获取到的只是同一个layout的新的实例???
求解啊?
暂时我只好把所有的R.id.xxx事先放到一个数组里,再一个一个地findViewById了。private boolean checkForm(int layoutId) {
//RelativeLayout layout = (RelativeLayout) getLayoutInflater().inflate(layoutId, null);
RelativeLayout layout = (RelativeLayout)LayoutInflater.from(this).inflate(layoutId, null);
layout = (RelativeLayout)findViewById(R.id.widget36);
boolean flag = true; for (int i = 0; flag && i < layout.getChildCount(); i++) {
View v = layout.getChildAt(i);
// Log.v("ID",v.getClass().getName().toString() + "," + v.getId());
flag = checkView(v);
}
return flag;
} private boolean checkView(View v) {
boolean flag = true;
//! 为什么所有的控件都取不到值 !!!
Log.v("check", v.getClass().getName().toString() + "," + v.getId()); if ((v instanceof ImageView) || (v instanceof TextView)) {
return true;
} else if (v instanceof EditText) {
// Log.v("test", v.getId() + "EditText="
// +((EditText)v).getText().toString());
// if (((EditText) v).getText().toString().equals("")) {
// Log.v("return", v.getClass().toString());
// return false;
// }
EditText e = (EditText) findViewById(v.getId());
Log.v("test", "editText=" + e.getText().toString());
return true;
} else if (v instanceof Spinner) {
// Log.v("return",(((Spinner)v).getSelectedItemId() ==
// AdapterView.INVALID_ROW_ID) + "");
if (((Spinner) v).getSelectedItem() == null) {
Log.v("return", v.getClass().toString());
// ! SO DOES Spinner!!! CANNOT getValue!!
// return false;
return true;
}
} else if (v instanceof RadioGroup) {
if (((RadioGroup) v).getCheckedRadioButtonId() == -1) {
// Log.v("return", v.getClass().toString() + "," +
// ((RadioGroup)v).getCheckedRadioButtonId());
// ? return false;
return true;
}
} else if (v instanceof ViewGroup) {
Log.v("Recurve", v.getClass().toString());
for (int i = 0; flag && i < ((ViewGroup) v).getChildCount(); i++) {
View vx = ((ViewGroup) v).getChildAt(i);
flag = checkView(vx);
}
return flag;
}
Log.v("return2", v.getClass().toString());
return true;
}
解决方案 »
- Android程序开机自动后台运行,怎么不让界面显示啊
- 帮帮我 在eclipse搭建android环境报错
- ViewGroup刷新问题
- Open quote is expected for attribute "android:name" 是什么错误?
- 求教,蓝牙刷卡器(Pos机?)如何连接Android设备
- Android UDP模式发送数据问题
- 走过路过不要错过,简单的后台运行问题!
- 如何实现这样的功能
- android sqlite使用数据大小有限制吗?
- 请问各位大神 android studio 下如何使用jar包中的so文件
- 我的DDMS没了怎么办
- PopupWindow显示问题 求指点
RelativeLayout loginLayout =(RelativeLayout)findViewById(R.id.relativeLayout1); //(RelativeLayout) getLayoutInflater().inflate(R.layout.oneactivity, null);
for (int i = 0; i < loginLayout.getChildCount(); i++) {
View v1=loginLayout.getChildAt(i);
if(v1 instanceof EditText ){
Log.v("check", v1.getClass().getName().toString() + "," + v1.getId());
EditText e = (EditText)findViewById(v1.getId());
Log.v("test", "editText=" + e.getText().toString());
}
}
//你的代码里用这个就可以了
RelativeLayout layout = (RelativeLayout)findViewById(layoutId);
public abstract LayoutInflater getLayoutInflater ()Since: API Level 1
Quick access to the LayoutInflater instance that this Window retrieved from its Context.照字面理解,应该获取的当前实际运行的那个context中的layout啊?
而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)参考这里
http://weizhulin.blog.51cto.com/1556324/311450