android - onPageSelected 在调用 onCreateView 之前运行?

标签 android

我正在使用 ViewPager 循环浏览一组 fragment ,我想在每个 fragment 滑到屏幕上后对其进行更新。基本上,我希望文本在 fragment 稳定后“淡入”。

我尝试使用 fragment 的 onStartonResume 方法,虽然这适用于大多数页面,但它不适用于第二页,因为对于任何愚蠢的因为,第一页和第二页同时调用了它们的 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/

相关文章:

android - 从发送的短信中获取数据

java - 无法实例化 Activity

android - Gradle同步需要很长时间才能完成解析依赖性

java - Android应用程序不同布局尺寸的问题

java - Eclipse 删除注释、断点并修复缩进

java - 暂停和恢复 Android 游戏 ->

java - 获取错误 java.lang.IllegalArgumentException : unexpected url

javascript - 在 iOS 和 Android 上使用 React Native 时,我还能使用原生第三方库吗?

android - 升级到 Gradle 3 后应用消失

java - 这里应该使用什么数据类型来接受来自服务器的响应