如何在android子组件中避免重复的id?

时间:2010-11-25 04:23:54

标签: android instance

我刚刚进入Android开发的有趣世界,但我正在研究的测试应用程序存在一个非常古怪的问题。

该应用使用TableLayout,其中每个TableRow包含一个EditText和一些按钮。

可以在运行时添加和删除TableRows。这一切似乎都工作正常,直到我不小心倾斜我的设备。显示屏响应并重新排列布局,但突然显示每行的所有值都相同。

经过一番头疼后,我发现了发生的事情。由于方向改变,Android正在重新启动活动。发生这种情况时,Android会尝试保存然后恢复您的实例状态,但它会通过存储相对于组件ID的数据来实现此目的。

在我的情况下,因为行都是从相同的布局创建的,所以每行中的EditText具有相同的id。据我所知,结果是当保存信息时,每行都会被覆盖,以便最后一行胜出。

恢复时,只有一个值与该ID相关联,因此它会应用于每一行!

在我的情况下,我能够解决它,因为我并不需要保持这些值。在我的onSaveInstanceState中,我不调用super.onSaveInstanceState,同样也调用onRestoreInstanceState。

所以这最终让我想到了我的问题!

如果我想要保存和恢复这些单独的行值,该怎么办?是否有一种可以在重用组件上生成唯一ID的方法(在我的例子中是TableRow)?

3 个答案:

答案 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 - 但似乎更棘手。