我有一组简单的动态生成的EditText字段及其各自的标签,我试图通过迭代父布局中的所有视图来获取它们的ID来保存数据。我的(简化)代码是:
<EditText
android:layout_width="wrap_content"
android:layout_height="40dp"
android:id="@+id/text_name"
android:visibility="invisible"
android:inputType="text"
android:layout_gravity="center_vertical"
android:layout_weight="0.47" />
我也尝试过:
int layoutChildren = linearLayout.getChildChildCount();
if(layoutChildren > 0){
for(int i = 0; i < layoutChildren; i++){
View v = linearLayout.getChildAt(i);
if(v instanceof EditText){
// This is returning -1
int ID = ((EditText)v).getId();
}
}
和
int ID = v.getId();
我知道有问题的EditText对象有一个id,因为如果我在创建后立即调用getId,它不会返回-1,但在迭代所有视图时它似乎不起作用。有没有修复或解决方法?我也很想知道为什么这种方法不起作用,因为我在java工作一段时间之后对android开发很陌生,并且好奇这是否是由某种缺失的知识引起的安卓行为。
谢谢!
编辑: 请求生成视图和ID的代码:它只是
EditText textObject = (EditText)v;
int ID = textObject.getId();
我想有可能维护一个已创建字段的列表并以这种方式访问它们,但代码不会那么干净,我个人很好奇为什么上述方法不起作用
答案 0 :(得分:0)
试试这个......
PropertySourcesPlaceholderConfigurer
并将其迭代为..
private List<View> getAllChildrens(View v) {
List<View> visited = new ArrayList<View>();
List<View> unvisited = new ArrayList<View>();
unvisited.add(v);
while (!unvisited.isEmpty()) {
View child = unvisited.remove(0);
visited.add(child);
if (!(child instanceof ViewGroup)) continue;
ViewGroup group = (ViewGroup) child;
final int childCount = group.getChildCount();
for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
}
return visited;
}
答案 1 :(得分:0)
这个问题是由我自己的代码中的疏忽造成的:我忘了为一个日期字段分配一个ID,该日期字段是一个EditText对象,设置为不接受输入,这导致-1返回值。为此字段分配ID可解决此问题。
向阅读该问题的任何人致歉,因为使用所提供的信息无法解决。也许最好在ID返回此值时包含错误处理检查,并将有关View的信息打印到控制台。