我刚刚进入Android开发的有趣世界,但我正在研究的测试应用程序存在一个非常古怪的问题。
该应用使用TableLayout,其中每个TableRow包含一个EditText和一些按钮。
可以在运行时添加和删除TableRows。这一切似乎都工作正常,直到我不小心倾斜我的设备。显示屏响应并重新排列布局,但突然显示每行的所有值都相同。
经过一番头疼后,我发现了发生的事情。由于方向改变,Android正在重新启动活动。发生这种情况时,Android会尝试保存然后恢复您的实例状态,但它会通过存储相对于组件ID的数据来实现此目的。
在我的情况下,因为行都是从相同的布局创建的,所以每行中的EditText具有相同的id。据我所知,结果是当保存信息时,每行都会被覆盖,以便最后一行胜出。
恢复时,只有一个值与该ID相关联,因此它会应用于每一行!
在我的情况下,我能够解决它,因为我并不需要保持这些值。在我的onSaveInstanceState中,我不调用super.onSaveInstanceState,同样也调用onRestoreInstanceState。
所以这最终让我想到了我的问题!
如果我想要保存和恢复这些单独的行值,该怎么办?是否有一种可以在重用组件上生成唯一ID的方法(在我的例子中是TableRow)?
答案 0 :(得分:1)
如果我是你,我不会在your_view.setId(your_new_id)
视图中使用EditText
,因为这会使您的应用不稳定:如果其他视图与{{1}具有完全相同的ID,该怎么办? }?
我会使用您的_ your_new_id
,然后使用view.setTag(some_unique_tag)
再次查看findViewWithTag(some_unique_tag)
视图。
EditText
可以是任何findViewWithTag(some_unique_tag)
- 我个人更喜欢Object
,因为这样可以轻松制作一些描述性和唯一标记。
请记住,只有使用String
的{{1}}才有标签。
答案 1 :(得分:1)
除了setId,View类中还有一个generateViewId方法。如果你想要17个版本,你可以从源代码中复制它。
答案 2 :(得分:0)
您可以使用Java生成TableRows并使用View.setId()
。您也可以将表行放在XML布局文件中,通过java& amp;设置ID - 但似乎更棘手。