意外的EditText重用

时间:2015-01-29 10:29:38

标签: android

实现类似于表的UI我遇到了一个非常奇怪的行为。旋转屏幕后,所有行都包含相同的编辑文本字段

这是我的代码:

主要活动:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ViewGroup layout = (ViewGroup) findViewById(R.id.table_layout);
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        addRow(inflater, layout, "A", 0);
        addRow(inflater, layout, "B", 1);
        addRow(inflater, layout, "C", 2);
    }

    private void addRow(LayoutInflater inflater, ViewGroup layout, String title, int value) {
        View view = inflater.inflate(R.layout.row, null, false);
        Row row = (Row) view;
        row.setTitle(title);
        row.setValue(value);
        layout.addView(row);
    }
}

主要活动布局:

<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
    a:layout_width="match_parent"
    a:layout_height="wrap_content"
    a:layout_gravity="center"
    a:orientation="vertical">

    <LinearLayout
        a:id="@+id/table_layout"
        a:orientation="vertical"
        a:layout_width="match_parent"
        a:layout_height="wrap_content" />

</LinearLayout>

表格行:

public class Row extends LinearLayout {

    public Row(Context context) {
        super(context);
    }

    public Row(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setTitle(String title) {
        final TextView titleView = (TextView) findViewById(R.id.title);
        titleView.setText(title);
    }

    public void setValue(int i) {
        final TextView valueEdit = (TextView) findViewById(R.id.value);
        valueEdit.setText("" + i);
    }
}

表格行布局:

<?xml version="1.0" encoding="utf-8"?>
<com.anagaf.freqhelper.Row
    xmlns:a="http://schemas.android.com/apk/res/android"
    a:layout_width="match_parent"
    a:layout_height="match_parent"
    a:orientation="horizontal">

    <TextView
        a:id="@+id/title"
        style="@style/RangeTitle"
        a:layout_marginBottom="@dimen/gap"
        a:layout_height="wrap_content"/>

    <EditText
        a:id="@+id/value"
        style="@style/ChannelEdit"/>

</com.anagaf.freqhelper.Row>

应用程序启动后表格看起来没问题:

A 0 
B 1
C 2

如果我将屏幕方向更改为横向,则表格将更改为:

A 2
B 2
C 2

看起来最后一行的EditText被重用于所有行。

如果我用TextView替换值EditText - 一切正常

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:0)

您正在将ViewGroup inflater.inflate(R.layout.row, null, false);充气为视图。相反,请将其充气为ViewGroup,然后使用yourviewgroup.findById(R.id.someview)获取您要填充的每个元素。

更好的方法是在代码中创建一个新的布局,然后夸大你的模板&#39;布局并从那里实例化每个元素。然后使用创建的布局显示刚刚实例化的元素。

这样,您只需对布局进行一次通气,并将其作为变量传递给每一行,返回一个新布局并将其放入活动的布局中。