在遍历所有视图的列表时,无法获取视图ID

时间:2015-10-12 14:07:02

标签: java android android-edittext hashmap android-view

我有一组简单的动态生成的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();

我想有可能维护一个已创建字段的列表并以这种方式访问​​它们,但代码不会那么干净,我个人很好奇为什么上述方法不起作用

2 个答案:

答案 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的信息打印到控制台。