Android:查找动态创建的视图的ID

时间:2017-04-12 10:03:50

标签: android view find

我遇到了以下问题:

在Android Studio中,我会在点击EditText时动态生成en ExerciseButton

public void exerciseButtonClick(View view) {
  EditText exercise = new EditText(this);
  exercise.setId(exerciseId);
  exerciseId++;
}

稍后在代码中,我想通过ID来引用我的EditText所有内容。我尝试这样的事情,但这不起作用:

for (int i = 1; i < exerciseId; i++) {
                EditText currentEditText = (EditText) findViewById(i);
                // further instructions on that EditText
}

错误当然是:findViewById(i),显示 ID为的预期资源类型。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您需要确保ID不会与Android生成的ID进行冲突。此外,您需要确保将视图添加到活动视图层次结构中,否则将永远不会找到它们。

在您的场景中,我可能会尝试以下其中一项

1)如果您仍想使用整数id,则使用此方法生成有效的非冲突ID

https://developer.android.com/reference/android/view/View.html#generateViewId

2)将tag设置为视图,然后按tag进行检索。标签可以是任何对象。

public void exerciseButtonClick(View view) {
  EditText exercise = new EditText(this);
  exercise.setTag("exercise-" + excersiceId);
  excersiceId++;
}


EditText exercise = (EditText)findViewByTag("exercise-" + someId );

3)保留一个局部变量,保存对创建的EditText(或创建的EditTexts数组)的引用

private EditText exercise;

public void exerciseButtonClick(View view) {
  exercise = new EditText(this);
  excersiceId++;
}

答案 1 :(得分:2)

这是因为您需要生成不与现有ID冲突的适当ID,然后将这些ID存储在数组中,以便您知道哪些用于生成的视图。

在API 17及更高版本中,您只需使用函数View.generateViewId()即可生成此ID。

否则您可以使用此代码(来自this answer):

private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

/**
 * Generate a value suitable for use in {@link #setId(int)}.
 * This value will not collide with ID values generated at build time by aapt for R.id.
 *
 * @return a generated ID value
 */
public static int generateViewId() {
    for (;;) {
        final int result = sNextGeneratedId.get();
        // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
        int newValue = result + 1;
        if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
        if (sNextGeneratedId.compareAndSet(result, newValue)) {
            return result;
        }
    }
}

答案 2 :(得分:2)

你可以添加你在一个ArrayList中并排添加的textView,并根据这样的arraylist的大小添加一个位置标记。

arrayList.add(textView);
textView.setTag(arraylist.size());

然后onClickListener你可以得到标签

onClick(View view){
if (view == arraylist.get(Integer.parseInt(view.getTag()))){
 // do onClick coding here
}
}

并使用该标记实现不同的clickListenrs。