【问题标题】:getView in fragment returns sometimes null片段中的 getView 有时返回 null
【发布时间】: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() 来处理这个问题

标签: android android-fragments


【解决方案1】:

首先,我不是 100% 确定,但我有几点需要提及。首先,我不喜欢您使用 thissuper 这样的方式,它们似乎含糊不清,我认为考虑到预编译您知道它们的值,更好的方法是更准确。我认为如果您将代码更改为以下内容,那会有所帮助(只是预感)。

// No need for 'this' and 'super' here, you are within the activity
mPagerAdapter  = new PagerAdapter(getSupportFragmentManager());
ViewPager pager = (ViewPager)findViewById(R.id.viewpager);
pager.setAdapter(mPagerAdapter);

public PagerAdapter(FragmentManager fm) {
    super(fm);
    // No need for 'this' here, you are within the class
    main = MainFragment.newInstance();
    list = ListFragment.newInstance();
}

// No need for 'super' here, you are within the activity
ViewPager pager = (ViewPager)findViewById(R.id.viewpager);
pager.setCurrentItem(0, true);
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id);

// Here use 'getActivity()' instead of 'getView()'
TextView s = (TextView)getActivity().findViewById(R.id.CurrentSelection);

让我知道发生了什么,干杯。

【讨论】:

  • 这个话题已经很老了,仍然没有被接受的答案。有同样的问题,正在寻找解决方案。一个重要的通知:当 android 杀死托管活动时,问题是重现(例如在内存之外)。在这种情况下,Android 会尝试重新启动活动。由于某种原因,onCreateView 在片段重新创建后不会被调用,而是在之前调用(!)。为了确定重现问题,可以在developer options 中设置destroy every activity as soon as user leaves it。然后暂停应用程序通过按主页按钮并恢复它。
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 2013-10-07
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多