我遇到了以下问题:
在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为的预期资源类型。我该如何解决这个问题?
答案 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。