我有一个带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);
寻呼机适配器在其构造函数中创建两个片段的实例:
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);
我尝试了几件我读过的事情,但问题仍然不规律地发生。
答案 0 :(得分:0)
首先,我不是百分百肯定,但我有几点需要提及。首先,我不喜欢你如何使用this
和super
这样的,它们看起来很模糊,我相信更好的方法是更准确,因为预编译你知道他们的值。我认为如果你将代码改为如下,那将有所帮助(只是预感)。
// 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);
让我知道会发生什么,干杯。