我有一个ViewGroup,它以编程方式实例化并为ViewPager分配ID。在旋转时,“向上”按钮和更改屏幕方向将重新创建视图 - 但它不记得ViewPager的最后一页索引。
我已经验证了OnSaveInstanceState()和OnRestoreInstanceState()都被调用,并且它们都包含正确的页面索引信息。但是,无论如何,ViewPager都会重置为将页面索引设置为0。我注意到我在控制台中收到了消息
No package identifier when getting name for resource number [id that I programmatically defined]
作为一项实验,我在XML中定义了ViewPager(以及ID)。它确实将ViewPager正确设置为最后一页索引。
所以,我怀疑Android框架实际上无法正确恢复上一个状态,因为当ViewGroup然后ViewPager被破坏时ID不会持久存在。
我怎样才能让它发挥作用?我想在此ViewGroup中包含所有状态相关的事物(例如,避免跟踪Fragment中的ViewPager位置)。但是,除非我能够持久化ID(如果这是根本原因),我似乎不能让它工作。
答案 0 :(得分:0)
编辑:我的代码中存在争用条件。确保我有一个唯一的ID后,它运作得很好。
在我看来(由于一些奇怪的原因),小于10的ID会将不正确的实例数据(可能来自另一个视图)返回到ViewPager的OnRestoreInstanceState()。
真的很奇怪,因为我在设置ID之前使用FindViewByID
来确保ID是唯一的。但是,可能存在竞争条件或我遗漏的事情。
无论如何,将ID设置为10或更高会产生正确的行为,并且ViewPager的位置会在方向更改之间持续存在。
答案 1 :(得分:0)
距离OP的帖子已有两年了,但我认为值得在此之后为人们提一些可能的问题。
在OP的原始帖子中,恢复以编程方式设置的ID的解决方案是将视图的id保存在其父级别中。因此,在还原时,父级将重新创建视图并将还原的ID设置回新视图。这样,您可以在配置更改之前恢复在此视图中保存的所有数据。
在OP自己的回答中,我的猜测是你为多个视图分配了相同的id。例如,您有视图A和视图B,并且您不小心为两者设置了相同的ID。稍后当您尝试在配置更改后从视图A恢复已保存状态时,您可能已恢复B的已保存状态。因此,您获得的实例数据不正确。注意B可能不是普通视图,也可能是菜单项或操作系统认为是视图的任何内容。你的id大于10的解决方案只是因为你的第二个视图(B)的id小于10,所以你很幸运。挖掘你的代码,看看你是否犯了同样的错误。