【发布时间】:2012-05-07 09:16:55
【问题描述】:
我有一个带有 ViewPager 的应用程序,其中包含两个片段:一个主片段和一个列表片段。如果选择了列表中的某些内容,则会引发在活动中处理的事件。活动切换到主片段并调用“setSelectedItem”方法。在这种方法中, 我使用 getView() 来查找特定视图以根据所选项目更改文本。
大部分时间它都有效,但有时 getView 返回 null,我不知道为什么。
pagerAdapter是在activity的OnCreate中创建的:
this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager());
ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager);
pager.setAdapter(this.mPagerAdapter);
寻呼机适配器在其构造函数中创建两个片段的实例:
public PagerAdapter(FragmentManager fm) {
super(fm);
this.main = MainFragment.newInstance();
this.list = ListFragment.newInstance();
}
这是在选择列表中的项目时调用的活动中的方法:
ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager);
pager.setCurrentItem(0, true);
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id);
最后,这是 MainFragment 中 setSelectedItem 方法中导致问题的行:
TextView s = (TextView)getView().findViewById(R.id.CurrentSelection);
我尝试了几件事,但问题仍然不规律地出现。
【问题讨论】:
-
不幸的是,我遇到了同样的问题,但没有解决方案。我的代码到处都是 if (getView() == null) return;在各个地方。如果你现在已经解决了这个问题,我会很感兴趣。
-
你能分享你将片段添加到片段管理器的代码吗?如果尚未为片段调用 onCreateView(片段生命周期的一部分),则 getView 可能会返回 null - 即片段尚未完全添加到活动中。
-
你在哪里调用“TextView s”?这是在Fragment中的公共视图getView吗?
-
分享更多代码,这肯定会有解决方案。根据我的经验,当您拥有 ViewPager 并假设您有 3 页时,当您位于第 1 页时,不会创建第 3 页。直到您滚动到第 1 页才会创建它。当转到第 3 页时,第 1 页被销毁。所以要小心如何与他们合作。我将 ViewPager 与片段一起使用,并在 onViewCreated(或类似)中为每个片段使用 GUI 交互。
-
我通过手动保持对主视图的引用而不依赖于 getView() 来处理这个问题