Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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 ViewPager-并不总是调用onCreateView_Android_Android Fragments_Android Viewpager_Android Pageradapter - Fatal编程技术网

Android ViewPager-并不总是调用onCreateView

Android ViewPager-并不总是调用onCreateView,android,android-fragments,android-viewpager,android-pageradapter,Android,Android Fragments,Android Viewpager,Android Pageradapter,我有一个10页的可视寻呼机。当我开始最后一(10)页onCreateView()时,我的片段的方法被调用。当我滑动到第9页时,也会调用onCreateView()。但是当我回到第10页时,没有调用onCreateView()。出什么事了?没什么事。ViewPager已经有了页面,因此不需要创建它。这是因为FragmentPagerAdapter在内存中保存每个片段。因此,当您第一次访问片段时,将调用onCreate,但第二次Android将在内存中查找,因此不需要调用onCreate pager

我有一个10页的可视寻呼机。当我开始最后一(10)页
onCreateView()
时,我的片段的方法被调用。当我滑动到第9页时,也会调用
onCreateView()
。但是当我回到第10页时,没有调用
onCreateView()
。出什么事了?

没什么事。
ViewPager
已经有了页面,因此不需要创建它。

这是因为FragmentPagerAdapter在内存中保存每个片段。因此,当您第一次访问片段时,将调用onCreate,但第二次Android将在内存中查找,因此不需要调用onCreate

pager.setAdapter(adapter);
如果每次显示片段时都需要在OnCreate中运行代码,那么应该将其移动到getItem(int-id)

pager.setAdapter(adapter);

请参阅官方文档:

您可以从onPageSelect调用适配器getItem,这在刷卡时也会调用,并将代码放在getItem中,甚至放在onPageSeelect本身中。

我也遇到了同样的问题,我的解决方案是重新分配ViewPager实例的适配器,就像:

pager.setAdapter(adapter);
这将导致从viewPager重新启动“mItems”属性并删除缓存

pager.setAdapter(adapter);

但我不知道这是否是一个安全的解决方案

CommonWare的答案是最好的,而且效果很好:
pager.setAdapter(adapter);
简单地将
OnPageChangeListener
添加到
ViewPager
项中,如下所示:

pager.setAdapter(adapter);
ViewPager     viewPager    = null;
PagerAdapter  pagerAdapter = null;

//Some code come here...

pagerAdapter = new PagerAdapter(); //Or any class derived from it
viewPager    = (ViewPager)findViewById(R.id.container);//Connect it to XML
viewPager.setAdapter (mPagerAdapter); //Connect the two

//Next two lines are simply for fun...
//viewager.setPageTransformer(true, new DepthPageTransformer());
//viewPager.setPageTransformer(true, new PaymentZoomOutPageTransformer());

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }
        //This is the right place to connect the pages with a data struct!!!
        @Override
        public void onPageSelected(int position) {
            // Here you can connect the current displayed page with some data..
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

 //Here use the inflater to add views/pages
 //Don't forget to do:
 pagerAdapter.notifyDataSetChanged();
 //When you're done...

请尝试扩展FragmentStatePagerAdapter

发布代码,以了解ViewPager适配器上发生的情况可能导致此问题。但是我不能不看你的代码就知道…这个问题有什么合适的解决方案吗?谢谢,但是我添加了Log.i(“你好”,“你好”+id);我只在启动viewpager时看到这个日志。当我在页面之间滑动时,它不会调用。好的,尝试为Fragment或FragmentPagerAdapter覆盖onResume方法.onResume?为Fragment覆盖onResume?或者如果需要在OnCreate和onResume中调用该代码,您可以编写一个单独的函数并从这两个方法中调用它。当任何一个方法(onStart、OnCreate、onCreateView)出现时,我该怎么做inoke不是吗?@Bakus123:一种可能是在
ViewPager
中添加一个
OnPageChangeListener
,这样你就能知道它何时更改页面。或者,只要在数据更改时更新页面,而不是等待用户刷到页面上,就可以对迄今为止创建的所有页面进行更新。@Bakus123:您需要跟踪存在哪些片段以及属于哪些位置。然后,你可以在你的片段上调用一些方法,告诉他们根据页面更改进行更新。这应该是可以接受的答案,它非常适合我。谢谢。:)是的,它是有效的,而且它确实应该是被接受的答案。@MehrdadSComputer当页面被选中时,片段被重新创建。所以onCreateView是called@Vinay当我们扩展FragmentPagerAdapter时,同样的情况不会发生?@MehrdadSComputer是的。使用FragmentPagerAdapter时会保存片段。当用户返回到前一个片段时,将显示从内存中提取而不是重新创建片段。
pager.setAdapter(adapter);