我遇到了一系列非常令人沮丧的问题。我想要一个明确的解决方案;因此,我将奖励这个问题的赏金。
生成EditText
个视图对的列表,这些视图会在方向更改(屏幕旋转)时自动保留其值。
EditText
对的数量是在运行时确定的。
ListView
使用ListView
ArrayAdapter
。数组适配器使用布局生成每对TextView
视图。 ListView
项的XML可能显示为:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/edit_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/edit_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
ArrayAdapter
只会让每个视图的布局都膨胀。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.listview_pair, parent, false);
在方向更改时,不会保留输入EditText
的值。由于EditText
视图是通过ArrayAdapter
实例化的,因此Android运行时无法自动预先填充EditText
视图及其在轮换之前的最后状态。这意味着我们必须手动保存/恢复用户输入 - 失败的要求#1。
TableLayout
和TableRow
s 我们可以为每个ListView
对充气TableRow
布局,而不是使用EditText
,并将其附加到TableLayout
。由于我们只知道运行时对的数量(根据需求#2),我们必须以编程方式实例化布局。类似的东西:
for (int i = 0; i < numPairs; ++i)
{
TableRow row = (TableRow) View.inflate(this, R.layout.tablerow_pair, null);
table.addView(row);
}
这也无法保持方向变化的状态。每对EditText
视图与Id
中的所有其他EditText
对具有相同的ListView
个视图。发生这种情况是因为我们为列表中的每个项目实例化相同的布局;因此,它们都具有相同的Id
s。在轮播时,Android会为每对EditText
值赋予相同的值,因为它们共享相同的Id
。
那么,有没有办法创建一个EditText
对列表,在方向更改时自动保留其状态?似乎必须有一种方法,但研究这个问题很困难,因为它是一个相当专业的用例。我很乐意为那些可以给我一个很好解释这种情况的人奖励一些赏金。
答案 0 :(得分:2)
您可以use setId()
使用EditText
小部件,无论是通过构造函数创建这些小部件还是通过布局膨胀(根据您的第二个策略)。使用generateViewId()
获取不同的视图ID。