我正在使用一个ViewPager循环浏览一组片段,并且我想在将每个片段滑到屏幕上后更新每个片段。基本上,我希望文本在片段解决后"淡入"。
我尝试使用片段的 onStart
和 onResume
方法,尽管它适用于大多数页面,但它不适用于第二页,因为无论出于愚蠢的原因,第一页和第二页都具有他们的onstart/onerstart/onResume方法同时调用(在第二页登录到屏幕之前)。
现在,我正在尝试使其与OnpageChangelistener的onPageSelected
回调一起使用。该方法看起来像这样:
@Override
public void onPageSelected(final int position) {
mCurrentPosition = position;
PageFragment fragment = (PageFragment) ((MainActivity.ScreenSlidePagerAdapter) mViewPager.getAdapter()).getItem(position);
fragment.onSelect();
}
和片段中的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: Attempt to invoke virtual method 'void android.widget.TextSwitcher.setText(java.lang.CharSequence)' on a null object reference
这表明该类中的onCreateView
方法尚未运行,因为那是mSwitcher
变量实例化的地方。这对我来说似乎是香蕉,因为此时的视图已经在屏幕上滑到屏幕上。
关于如何解决此问题的任何想法将不胜感激。这是我的第一个Android体验,我一直在尝试解决这个愚蠢的文字播放问题,整整一周没有运气。在这一点上,我几乎准备放弃移动设备作为一个平台,因为每个小变化的痛苦都到目前为止。
ViewPager将下一页保留在Memory&这是默认行为。您可以通过以下呼叫来调整它:
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()
}
}
i有与您的类似问题,在初始化片段之前,请调用OnPagesElected(),但是您的描述不够详细,例如您如何选择第二页。
当适配器被片段喂食时,或者我们说getCount()> 0时,getItem()将返回任何片段,而不是null。但这并不意味着它是初始化的,至少如果您从fragmentStatePagerAdapter延伸。
当适配器被数据馈送并称为notifydatasetchange()时,默认情况下,适配器将初始两个页面初始化。如果您在NotifyDataSetchange()()后立即调用SetCurrentItem()立即转移到其他页面。在运行时,可以在初始化片段之前调用setCurrentItem() -> OnPagesElected()。
我的解决方案是在setCurrentItem()时使用view.post()。例如
viewPager.post(() -> viewPager.setCurrentItem(index));