【问题标题】:onCreateView of second fragment (tab) is called while on the first在第一个片段(选项卡)上调用第二个片段(选项卡)的 onCreateView
【发布时间】:2018-04-13 17:06:56
【问题描述】:

我的activity 中有 10 个标签。一旦我打开活动,就会显示第一个片段,但会调用下一个片段中存在的方法(AsyncTask)。 如果我转到下一个选项卡说第三个选项卡,那么第四个fragment 中的方法会被调用,依此类推。

我不明白这种行为。请帮忙!

【问题讨论】:

    标签: android android-fragments android-tabs fragmentpageradapter


    【解决方案1】:

    您必须知道viewPager 如何在不同位置填充fragment

    当您从位置 0 开始时,会创建位置 0 上的 fragment 和位置 1 之一。

    然后,当您滑动到位置 1 时,会在位置 2 上创建 fragment,因此您现在在不同位置上创建了三个 fragments(0,1,2..假设您只有 3 页在viewPager)。

    我们滑动到位置 2,最后一个位置,第一个位置 (0) 上的 fragment 被销毁,所以我们现在在位置 2 和 3 上有 fragments

    这就是Fragment LifeCycle 的工作原理

    你可以设置mViewPager.setOffscreenPageLimit(2); // 2 is just an example来限制它

    如果您希望在Fragment 对用户可见时执行某些代码,请在setUserVisibleHint 方法中添加部分代码

    【讨论】:

      【解决方案2】:

      默认为 viewpager.setOffscreenPageLimit(1) ,这意味着 View pager 将默认加载至少 1 个在当前选项卡的右侧和一个在左侧选项卡上。

      这样做,主要是因为当您滑动查看器时,两个选项卡的某些区域都可见。对于那些平滑过渡,需要预加载。

      不能设置它viewpager.setOffscreenPageLimit(0).

      唯一的出路就是用这个方法setUserVisibleHint 将此添加到您的片段中

      @Override
      public void setUserVisibleHint(boolean isVisibleToUser) {
          super.setUserVisibleHint(isVisibleToUser);
          if (isVisibleToUser) {
              // load data here
          }else{
             // fragment is no longer visible
          }
      }
      

      仅当该特定选项卡对用户可见时才会调用,因此只有这样您才能调用所有加载函数。

      检查sample example

      【讨论】:

      • 是的,这有帮助。但是,如果数据已被获取并加载,那么在返回上一个选项卡时,为什么我必须再次获取并加载它?
      • 因为它不会存储在任何地方。所以你需要重新加载它。
      • ontabselection 它将重新加载该片段,并且在该片段中,您的方法将根据其生命周期被调用,因此它将再次加载数据@VaibhavDhunde
      • 我还在做同样的事情。肯定会相信你。谢谢。 :)
      【解决方案3】:

      把你的 AsyncTask 方法放在里面。

      您可以像这样覆盖 setMenuVisibility:

      @Override
      public void setMenuVisibility(final boolean visible) {
         if (visible) {
            //execute AsyncTask method
         }
      
         super.setMenuVisibility(visible);
      }
      

      编码愉快!!

      【讨论】:

        【解决方案4】:
        Override below method and move your code for Aync task into this instead of onStart() or onCreateView.
        
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if (isVisibleToUser) {
                // Load your data here or do network operations here
                isFragmentLoaded = true;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-20
          • 1970-01-01
          相关资源
          最近更新 更多