1

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

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

每次我单击重置按钮时,只有当前页面和每个相邻页面都会更新。

例如

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

我认为问题是 FragmentPagerAdapter。文档说:

PagerAdapter 的实现,它将每个页面表示为一个 Fragment,只要用户可以返回该页面,它就会永久保存在 Fragment 管理器中。

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

编辑:

我发现,实际上我的 ToggleButtons(在所有 Fragments 上)的所有 checked()-values 都会更新,但不是 Fragments 的膨胀视图,它们不可见,也不是相邻的 Fragments。因此,当我返回到之前的片段时,ToggleButtons 的已检查()值将重置为片段上次可见时的状态。奇怪的...

例子:

  1. Page2 活动 - ToggleButton_Page2.checked() = true
  2. 切换到第 0 页
  3. 按重置按钮。Toast ToggleButton_Page2.checked() = false
  4. 切换回第 2 页(或已在第 1 页)
  5. ToggleButton_Page2.checked() = true //应该是 false

资源:

示例源代码

4

2 回答 2

1

那么如何访问目前不可见的 Fragment 中的 ToggleButtons ,也不是当前 Fragment 的邻居?有什么解决方法吗?

您的代码中有很多问题,您应该阅读更多关于Fragments并在ViewPager.

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

另外,与我上面所说的相关,您不需要将 a 传递Context给 a Fragment,因为 aFragment与 an 相关联的ActivityhasgetActivity()方法返回对 that 的引用Activity

您不应该访问任何ViewPager不靠近可见片段的片段(在可见位置的左侧/右侧,除非您不使用 的setOffscreenPageLimit()方法ViewPager)。它ViewPager有一种提高性能的机制(就像 aListView一样),所以它只创建它立即需要的东西,这样它就可以为用户提供流畅的滑动。

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

于 2013-02-07T08:55:44.130 回答
0

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

“但你不应该这样做,保存对上下文的引用的静态字段(就像任何视图一样)是危险的,因为你有泄露该上下文的风险。”

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

据我了解,我可以访问超过 +-1 个片段,例如,如果我使用 setOffscreenPageLimit(3)。我想这就是我的问题的答案。

于 2013-02-07T11:19:19.810 回答