OnPagesElected运行在调用OnCreateview之前



我正在使用一个ViewPager循环浏览一组片段,并且我想在将每个片段滑到屏幕上后更新每个片段。基本上,我希望文本在片段解决后"淡入"。

我尝试使用片段的 onStartonResume方法,尽管它适用于大多数页面,但它不适用于第二页,因为无论出于愚蠢的原因,第一页和第二页都具有他们的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));

最新更新