我有以下问题:
在 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
}
}
并使用该标记来实现不同的点击侦听器。