方向改变:LinearLayout的子节点不能有@ + id / something

时间:2013-05-09 21:17:29

标签: android

Android Google group

交叉发布

我今天早些时候遇到过这个问题: https://code.google.com/p/android/issues/detail?id=55106

问题是:

  • LinearLayout有孩子
  • 每个孩子都从相同的XML布局文件中膨胀
  • 一个孩子的嵌套元素有一些ID。
    • 该ID用于调用findViewById(ID)来设置一些值
  • 一切都在启动时正确显示,但在方向更改后,LinearLayout的每个子项都显示最后一个数据项的值
  • 只要从子XML布局文件中删除ID,一切就会正常运行

该bug附有示例项目,用于演示问题。

只是想问一下是否有人遇到过同样的问题,并且知道解决方法吗?

提前谢谢。


编辑:

LinearLayout的情况非常不稳定。我终于让项目工作了 - 参见第二个附加项目 https://code.google.com/p/android/issues/detail?id=55106

如果您转到item_main.xml并将android:textIsSelectable从false更改为true,则会显示错误。 保持android:textIsSelectable =“true”,但删除android:id =“@ + id / text” - 错误再次消失

我尝试使用此LinearLayout的主要原因是因为我想要关注您的布局动画示例。 http://developer.android.com/training/animation/layout.html

但似乎情况是如此不稳定,使用LinearLayout和方向更改,我需要回到工作ListView + Adapter方法,并找出在向适配器添加项目和重新验证列表时如何进行类似的布局动画。 / p>

3 个答案:

答案 0 :(得分:2)

另一种解决方法是在onSaveInstanceState方法中删除LinearLayout中的所有视图。

@Override
protected void onSaveInstanceState(Bundle outState) {
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.yourLinearLayoutId);
    linearLayout.removeAllViews();
    super.onSaveInstanceState(outState);
}

答案 1 :(得分:0)

您是否有任何特殊原因要为50个子布局进行充气然后将它们插入ScrollView而不是使用AdapterView?

在我看来,您可能应该使用ListView与某种适配器,它将为您处理行充气和数据绑定,这不仅会提高效率和性能,还会让您避免这种“错误”你遇到了什么。

每当你在一个循环中膨胀视图时,它应该是提示你应该重新考虑你的方法并开始使用某种类型的AdapterView(ListView,Gallery等... )

答案 2 :(得分:0)

当您添加一些TextViews并为其重复使用相同的ID(android:id="@+id/text")时,我最好的猜测是,一旦您调用,您就会遇到意外行为(充其量) findViewByID方法。要做你显然想要做的事情(使用TextViews列表,你可以做类似于here的建议,即创建一个TextViews数组,实例化它们并保留它们内部参考。

你发现的实际上并不是一个bug,它的行为应该是这样:所有TextView都有相同的id,所以所有的都会同时改变。

我查阅了文档中的actual reference(强调我的):

  

ID在整个树中不一定是唯一的,但应该   在您正在搜索的树的一部分中是唯一的(可能经常   是整棵树,所以最好是完全独特的   可能的)。