为什么对一个EditText的更改会更改具有相同ID的所有EditText?

时间:2015-06-26 00:09:09

标签: android android-layout android-edittext

为什么对一个EditText的更改会改变所有具有相同ID的EditText,尽管它们是单独存储和更改的?

示例:

我正在尝试创建 n 行的表格。每行都是从table_row.xml包含带有android:id="@+id/row_value"

的EditText的布局文件创建的

当我调用updateTable()时,表中的所有EditText都会更改为上次更改的值。

  • 鉴于: n = 3,
  • 用户分别在每个EditText中输入a,b,c
  • 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();
    }
}

2 个答案:

答案 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都将被修改