为什么对一个EditText的更改会改变所有具有相同ID的EditText,尽管它们是单独存储和更改的?
示例:
我正在尝试创建 n 行的表格。每行都是从table_row.xml
包含带有android:id="@+id/row_value"
当我调用updateTable()
时,表中的所有EditText都会更改为上次更改的值。
updateTable()
被称为
所有EditText值都设置为c(最后一个值)table_row.xml
<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<EditText
android:id="@+id/row_value"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
</TableRow>
Fragment.java
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
TableLayout table = (TableLayout) base.findViewById(R.id.data_table);
for(int i = 0; i < n; i++){
TableRow row = (TableRow) inflater.inflate(R.layout.table_row, null);
EditText inputField = (EditText) row.findViewById(R.id.row_value);
final int index = i;
inputField.setOnFocusChangeListener(new View.OnFocusChangeListener(){
@Override
public void onFocusChange(View v, boolean hasFocus) {
EditText editText = (EditText)v;
String value = editText.getText().toString();
storage.put(index, value); // Store row number and user value;
}
}
editTextMap.put(index, inputField);// Store a reference to editText
table.addView(row);
}
updateTable();
return table;
}
private void updateTable(){
for(int i = 0; i < n; i++) {
String value = storage.get(i);
EditText edit = editTextMap.get(i);
edit.setText(value);
edit.invalidate();
}
}
答案 0 :(得分:0)
我从EditText中删除了android:id
属性,而是将其替换为android:tag
属性。
所以不要:
EditText inputField = (EditText) row.findViewById(R.id.row_value);
更改为:
EditText inputField = (EditText) row.findViewWithTag("userInput");
UpdateTable()
现在可以正常工作,因为每个EditText值都会恢复到正确的值而不是恢复到最后一个条目。
我对此解决方案并不完全满意。
答案 1 :(得分:-1)
组件的ID必须是唯一的,如果某些组件在getViewById时具有相同的id,您将获得多个组件,如果您更改了所有的文本,则所有edittexts都将被修改