我正在使用 ViewPager 循环浏览一组 fragment ,我想在每个 fragment 滑到屏幕上后对其进行更新。基本上,我希望文本在 fragment 稳定后“淡入”。
我尝试使用 fragment 的 onStart
和 onResume
方法,虽然这适用于大多数页面,但它不适用于第二页,因为对于任何愚蠢的因为,第一页和第二页同时调用了它们的 onStart/onResume 方法(在第二页到达屏幕之前)。
现在我试图让它与 onPageChangeListener 的 onPageSelected
回调一起工作。该方法如下所示:
@Override
public void onPageSelected(final int position) {
mCurrentPosition = position;
PageFragment fragment = (PageFragment) ((MainActivity.ScreenSlidePagerAdapter) mViewPager.getAdapter()).getItem(position);
fragment.onSelect();
}
fragment 中的onSelect
方法如下所示:
public void onSelect(){
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
mSwitcher.setText("");
mNum = getArguments() != null ? getArguments().getInt("num") : 1;
Media currentMedia = slideshow.getMedia().get(mNum);
mSwitcher.setText(currentMedia.getDisplayName());
}
},
4000);
}
这种方式的问题是行 mSwitcher.setText("");
抛出一个 NullPointerException
java.lang.NullPointerException:尝试在空对象引用上调用虚方法“void android.widget.TextSwitcher.setText(java.lang.CharSequence)”
这表明该类中的 onCreateView
方法尚未运行,因为这是实例化 mSwitcher
变量的地方。这对我来说似乎很疯狂,因为此时 View 已经滑到屏幕上了。
任何有关如何解决此问题的想法将不胜感激。这是我的第一次 Android 体验,整整一周我都在尝试解决这个愚蠢的文本淡入问题,但没有成功。在这一点上,我几乎准备放弃移 Action 为一个平台,因为到目前为止每一个小的改变都是多么痛苦。
最佳答案
ViewPager 将下一页保存在内存中,这是它的默认行为。您可以通过调用来调整它:
viewPager.setOffscreenPageLimit(2);
但是这可能没有用,因为如果您在上面的方法中传递 0,viewPager 将忽略它。
你正朝着正确的方向前进。我相信现在问题出在您的 ScreenSlidePagerAdapter
中。在 getItem(int position)
你可能有类似的东西
if(position == 1)
return new PageFragment();
而是将适配器更改为如下内容,
public class ScreenSlidePagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragments = new ArrayList<>();
public ScreenSlidePagerAdapter(FragmentManager fm, List<Item> items) {
super(fm);
for (Item item : items) {
mFragments.add(new PageFragment());
}
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position); // Return from list instead of new PagerFragment()
}
}
关于android - onPageSelected 在调用 onCreateView 之前运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46125484/