并非ViewPager的片段中的所有视图都会更新

时间:2013-02-06 12:56:05

标签: android android-fragments android-viewpager togglebutton

我的ViewPager中有3个片段。 在我的片段中我添加了静态ToggleButtons。(静态,因为我没有找到nullpointerexception的解决方法,如果我想在自定义方法中的Fragment类中使用findViewById()而不是onCreateView())

在我的MainActivity中的ViewPager之外我有一个Reset-Button,它应该将所有ToggleButtons(在所有3个片段上)重置为“未选中”。

每次我点击重置按钮,只会更新当前页面和每个邻居页面。

E.G。

  • 当前页:0更新页数:0,1
  • 当前页:1更新页数:0,1,2
  • 当前页:2更新页数:1,2

我认为问题是FragmentPagerAdapter。 Documentation说:

  

PagerAdapter的实现,将每个页面表示为片段   只要用户,它就一直保存在片段管理器中   可以返回页面

当我在第2页时,我无法直接返回到第0页,所以我认为第0页(=片段0)的视图不再存在于内存中了?! 那么如何访问目前不可见的片段内的ToggleButtons,也不是当前片段的邻居?有没有解决方法?

编辑:

我发现,在契约中所有checked() - 我的ToggleButtons(在所有片段上)的值都得到了更新,但没有更新的片段视图,这些片段是不可见的而不是邻居片段。因此,当我返回到之前的片段时,ToggleButtons的checked() - 值将重置为上次片段可见时的状态。奇怪...

示例:

  1. Page2 active - ToggleButton_Page2.checked()= true
  2. 切换到第0页
  3. 按Reset-Button。 Toast ToggleButton_Page2.checked()= false
  4. 切换回第2页(或已经在第1页)
  5. ToggleButton_Page2.checked()= true //应为false
  6. 来源:

    Example Source Code

2 个答案:

答案 0 :(得分:1)

  

那么如何访问片段内的ToggleButtons呢?   此刻可见,也不是当前片段的邻居?是   有解决方法吗?

您的代码中存在很多问题,您应该多阅读Fragments并在ViewPager中使用它们。

在重置和状态按钮OnClickListeners侦听器中,您编写_adapter.getItem(x);以尝试获取代表该位置页面的Fragment句柄。这不会像简单地调用该方法将返回该位置Fragment新实例而不是实际使用的Fragment ViewPager一样前一刻getItem())。调用getItem()后获得的新实例与Activity无关,并且未调用其onCreateView方法,因此无法查看(并且当您获得NullPointerException时你访问它)。然后,您尝试通过将ToggelButton作为Fragment中的静态字段来解决此问题,因为当ViewPager正确创建Fragments时字段将被初始化一开始。但是你不应该这样做,那些包含Context引用的静态字段(就像任何View一样)是危险的,因为你冒着泄漏Context的风险。

此外,与我上面所说的相关,您不需要将Context传递给Fragment作为与Fragment绑定的Activity getActivity()方法返回对Activity的引用。

您不应该访问ViewPager中任何不在可见片段附近的片段(可见片段左/右的片段,除非您不使用{{1} } setOffscreenPageLimit()的方法。 ViewPager有一种提高性能的机制(如ViewPager所做的那样),因此它只会立即创建所需内容,以便为用户提供平滑的滑动。

我对您的项目check them out进行了一些更改。如有其他问题,请在您的问题中发布相关代码。

答案 1 :(得分:0)

萨吕, 感谢您提供了良好的信息和改进的代码!

  

“但你不应该这样做,静态字段包含引用   上下文(就像任何View一样)是危险的,因为你冒泄漏的风险   上下文中,“

我是Fragment实现的新手,花了几个小时的时间找出输入String如何正确地用于findFragmentByTag()。(现在知道如何使用它我从未想过它会那么复杂)。所以我决定采用静态解决方法,这不是一个好主意......

据我了解,我可以访问更多的+ -1片段,例如,如果我使用setOffscreenPageLimit(3)。我认为这是我的问题的答案。