【问题标题】:ViewPager - onCreateView is not always calledViewPager - onCreateView 并不总是被调用
【发布时间】:2014-08-29 18:32:56
【问题描述】:

我有一个 10 页的 ViewPager。当我开始我的片段的最后(第 10)页 onCreateView() 方法时。当我滑动到第 9 页时,onCreateView() 也会被调用。但是当我回到第 10 页时,onCreateView() 没有被调用。怎么了?

【问题讨论】:

  • 贴出代码让我们了解发生了什么
  • 您的 ViewPager 适配器可能会导致此问题。但是如果没有看到您的代码,我就无法知道...
  • 这个问题有什么合适的解决方案吗?

标签: android android-fragments android-viewpager android-pageradapter


【解决方案1】:

尝试扩展 FragmentStatePagerAdapter

【讨论】:

  • 它应该被接受 答案,它对我来说很完美。谢谢。 :)
  • 是的,它有效,它确实应该是公认的答案。
  • @MehrdadSComputer 选择页面时会重新创建片段。所以 onCreateView 被调用
  • @Vinay 当我们扩展 FragmentPagerAdapter 时,不会发生同样的事情吗?
  • @MehrdadSComputer 是的。使用 FragmentPagerAdapter 时会保存片段。当用户返回到前一个片段时,它会显示从内存中获取而不是重新创建片段。
【解决方案2】:

这是因为 FragmentPagerAdapter 将每个片段都保存在内存中。因此,当你第一次访问fragment时,会调用onCreate,但第二次Android会在内存中寻找,所以它不需要调用onCreate。

如果每次显示片段时都需要在 OnCreate 中运行代码,则应将其移至 getItem(int id)

查看官方文档:http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html

【讨论】:

  • 谢谢,不过我加了 Log.i("hello", "hello" + id);到 getItem 方法,这个日志我只在启动 viewpager 时看到。当我在页面之间滑动时它不会调用。
  • 好的,尝试覆盖onResume方法。
  • onResume for Fragment 或 FragmentPagerAdapter ?
  • onResume for Fragment,或者如果您需要在 OnCreate 和 OnResume 中调用该代码,您可以编写一个单独的函数并从这两个方法调用它。
【解决方案3】:

没有错。 ViewPager 已经有页面,所以不需要创建它。

【讨论】:

  • 当任何方法(onStart、OnCreate、onCreateView)不是 inoke 时,我该怎么办?
  • @Bakus123:一种可能性是将OnPageChangeListener 添加到ViewPager,这样您就知道它何时更改页面。或者,对于目前已创建的所有页面,只需在数据更改时更新页面,而不是等待用户滑动到它。
  • @Bakus123:您需要跟踪哪些片段存在以及属于哪些位置。然后,您可以在您的片段上调用一些方法来告诉它们根据页面更改进行更新。
【解决方案4】:

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

pager.setAdapter(adapter);

这会导致 viewPager 中的“mItems”属性重新启动并删除缓存。

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

【讨论】:

    【解决方案5】:

    您可以从 onPageSelect 调用适配器 getItem,它也在滑动时调用,并将您的代码放在 getItem 中,甚至放在 onPageSeelect 本身中。

    【讨论】:

      【解决方案6】:

      CommonWare 的答案是最好的,而且很有魅力: 简单地将OnPageChangeListener 添加到您的ViewPager 项目中,如下所示:

      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...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-18
        • 1970-01-01
        • 2014-08-23
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        相关资源
        最近更新 更多