片段中的getView有时返回null

Jan*_*nen 6 android android-fragments

我有一个带ViewPager的应用程序,它包含两个片段:主片段和列表片段.如果选择了列表中的某些内容,则会引发一个在活动中处理的事件.活动切换到主片段并调用"setSelectedItem"方法.在此方法中,我使用getView()查找特定视图以根据所选项目更改文本.

大多数时候它工作,但有时getView返回null,我不知道为什么.

pagerAdapter是在活动的OnCreate中创建的:

this.mPagerAdapter  = new PagerAdapter(super.getSupportFragmentManager());
ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager);
pager.setAdapter(this.mPagerAdapter);
Run Code Online (Sandbox Code Playgroud)

寻呼机适配器在其构造函数中创建两个片段的实例:

public PagerAdapter(FragmentManager fm) {
    super(fm);
    this.main = MainFragment.newInstance();
    this.list = ListFragment.newInstance();
}
Run Code Online (Sandbox Code Playgroud)

这是活动中的方法,当选择列表中的项时调用该方法:

ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager);
pager.setCurrentItem(0, true);
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id);
Run Code Online (Sandbox Code Playgroud)

最后,这是MainFragment中setSelectedItem方法中导致问题的行:

TextView s = (TextView)getView().findViewById(R.id.CurrentSelection);
Run Code Online (Sandbox Code Playgroud)

我尝试了几件我读过的东西,但问题仍然不规律地发生.

Luc*_*yMe 0

首先,我不是 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);
Run Code Online (Sandbox Code Playgroud)
public PagerAdapter(FragmentManager fm) {
    super(fm);
    // No need for 'this' here, you are within the class
    main = MainFragment.newInstance();
    list = ListFragment.newInstance();
}
Run Code Online (Sandbox Code Playgroud)
// 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);
Run Code Online (Sandbox Code Playgroud)
// Here use 'getActivity()' instead of 'getView()'
TextView s = (TextView)getActivity().findViewById(R.id.CurrentSelection);
Run Code Online (Sandbox Code Playgroud)

让我知道发生了什么,欢呼。