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



我有以下问题:

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

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 的预期资源类型。如何解决这个问题?

你需要

确保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++;
}

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

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

否则,您可以使用此代码(来自此答案(:

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;
        }
    }
}

您可以并排添加要添加到ArrayList中的textView,并根据数组列表的大小添加位置标签。

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

然后在点击监听器上,你可以让标签做

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

并使用该标记来实现不同的点击侦听器。

最新更新