1

来自Android Google 群组的交叉发帖

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

问题是:

  • 线性布局有孩子
  • 每个孩子都从同一个 XML 布局文件中膨胀
  • 一个子元素具有一些 ID 的嵌套元素。
    • ID 用于调用 findViewById(ID) 来设置一些值
  • 一切都在启动时正确显示,但在方向更改后 LinearLayout 的每个子项都显示最后一个数据项的值
  • 一旦从子 XML 布局文件中删除 ID,一切都开始正常工作

该错误附有演示该问题的示例项目。

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

先感谢您。


编辑:

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 方法,并弄清楚在向适配器添加项目和重新验证列表时如何做类似的布局动画。

4

3 回答 3

2

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

@Override
protected void onSaveInstanceState(Bundle outState) {
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.yourLinearLayoutId);
    linearLayout.removeAllViews();
    super.onSaveInstanceState(outState);
}
于 2013-05-28T13:28:58.663 回答
0

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

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

我在文档中查找了实际参考(重点是我的):

ID 不必在整个树中是唯一的,但它应该在您正在搜索的树的一部分中是唯一的(这通常可能是整棵树,因此最好尽可能完全唯一)。

于 2013-05-09T21:48:34.237 回答
0

你有什么特别的原因为什么你要膨胀 50 个子布局,然后将它们插入 ScrollView 而不是使用 AdapterView?

在我看来,您可能应该将 ListView 与某种适配器一起使用,该适配器将为您处理行膨胀和数据绑定,这不仅会提高效率和性能,还会让您避免出现这种“错误”相遇。

任何时候你在循环中膨胀视图都应该是一个强烈的暗示,你应该重新考虑你的方法并开始使用某种适配器视图(ListView、Gallery 等......)

于 2013-05-09T21:34:31.763 回答