Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onPageSelected在调用onCreateView之前运行?_Android - Fatal编程技术网

Android onPageSelected在调用onCreateView之前运行?

Android onPageSelected在调用onCreateView之前运行?,android,Android,我使用一个ViewPager循环浏览一组片段,我想在每个片段滑到屏幕上后更新它。基本上,我希望文本在片段稳定后“淡入” 我尝试使用片段的onStart和onResume方法,虽然这适用于大多数页面,但不适用于第二个页面,因为无论出于什么愚蠢的原因,第一个页面和第二个页面都同时调用了它们的onStart/onResume方法(在第二个页面进入屏幕之前) 现在我正试图让它与onPageChangeListener的onPageSelected回调一起工作。该方法如下所示: @Override pub

我使用一个ViewPager循环浏览一组片段,我想在每个片段滑到屏幕上后更新它。基本上,我希望文本在片段稳定后“淡入”

我尝试使用片段的
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();

}
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);
}
片段中的
onSelect
方法如下所示:

@Override
public void onPageSelected(final int position) {
    mCurrentPosition = position;

    PageFragment fragment = (PageFragment) ((MainActivity.ScreenSlidePagerAdapter) mViewPager.getAdapter()).getItem(position);

    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
变量就是在这里实例化的。这对我来说似乎很疯狂,因为此时视图已经滑到屏幕上了


任何关于如何解决这个问题的想法都将不胜感激。这是我第一次使用安卓系统,一周来我一直在努力解决这个愚蠢的文本淡入问题,但运气不佳。现在,我几乎准备放弃手机作为平台,因为到目前为止,每一个微小的改变都是多么痛苦。

ViewPager将下一页保留在内存中&这是它的默认行为。您可以通过如下方式进行调整:

viewPager.setOffscreenPageLimit(2);
但是,这可能没有用,因为如果在上述方法中传递0,viewPager将忽略它

你正朝着正确的方向前进。我相信现在问题出在您的
屏幕幻灯片适配器中。在
getItem(int位置)
中,您可能会遇到如下情况

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()
    }
}
公共类ScreenSlidePagerAdapter扩展了FragmentPagerAdapter{
私有列表MFFragments=newArrayList();
公共屏幕SlidePagerAdapter(FragmentManager格式,列表项){
超级(fm);
用于(项目:项目){
添加(新的页面片段());
}
}
@凌驾
public int getCount(){
返回mffragments.size();
}
@凌驾
公共片段getItem(int位置){
return mffragments.get(position);//从列表返回,而不是从新的PagerFragment()返回
}
}

我的问题与您的问题类似,在初始化片段之前会调用onPageSelected(),但您的描述不够详细,例如如何选择第二页

当向适配器提供片段时,或者我们说getCount()>0,getItem()将返回一个非空的片段。但这并不意味着它已初始化,至少如果您从FragmentStatePagerAdapter进行扩展,它不会初始化

当适配器收到数据并调用notifyDataSetChange()时,默认情况下,适配器将初始化前两页。如果在notifyDataSetChange()之后立即调用setCurrentItem()移动到其他页面,则可能会发生问题。在运行时,在初始化片段之前,可能会调用setCurrentItem()->onPageSelected()

我的解决方案是在setCurrentItem()时使用view.post()。e、 g


“第一页和第二页同时调用了它们的onStart/onResume方法”-这就是
ViewPager
处理片段的方式(默认情况下)。您可以使用片段中的Show your
onCreateView()
方法调整加载的屏幕外片段的数量。是的,这起作用了。我认为其中的一些问题存在于我的PageFragment类中,该类包含对整个幻灯片的引用,而不是每个片段包含一个媒体对象,但是如您所述更改适配器是绝对必要的。我能问一下为什么会这样吗?你是怎么知道这是个问题的?这是因为该策略确保提前创建所有片段吗?这样做,您总是会得到在ViewPager中膨胀的相同片段实例,而当您返回new MyFragment()时,每次调用它都会得到不同的实例&因此出现空指针异常