我的ViewPager中有3个片段。 在我的片段中我添加了静态ToggleButtons。(静态,因为我没有找到nullpointerexception的解决方法,如果我想在自定义方法中的Fragment类中使用findViewById()而不是onCreateView())
在我的MainActivity中的ViewPager之外我有一个Reset-Button,它应该将所有ToggleButtons(在所有3个片段上)重置为“未选中”。
每次我点击重置按钮,只会更新当前页面和每个邻居页面。
E.G。
我认为问题是FragmentPagerAdapter。 Documentation说:
PagerAdapter的实现,将每个页面表示为片段 只要用户,它就一直保存在片段管理器中 可以返回页面。
当我在第2页时,我无法直接返回到第0页,所以我认为第0页(=片段0)的视图不再存在于内存中了?! 那么如何访问目前不可见的片段内的ToggleButtons,也不是当前片段的邻居?有没有解决方法?
我发现,在契约中所有checked() - 我的ToggleButtons(在所有片段上)的值都得到了更新,但没有更新的片段视图,这些片段是不可见的而不是邻居片段。因此,当我返回到之前的片段时,ToggleButtons的checked() - 值将重置为上次片段可见时的状态。奇怪...
示例:
答案 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)。我认为这是我的问题的答案。