【问题标题】:Viewpage+tablayout: Why fragment 2 3 start when fragment 1 called?Viewpager+tablayout:片段 1 调用时片段 2 3 开始?
【发布时间】:2016-05-16 11:57:29
【问题描述】:

当我启动应用程序时,Tab Home 启动,但 Cung Hoàng Đạo 也启动。当我选择选项卡 Cung Hoàng Đạo 时,Tab 12 Con Giap 和 Tử Vi 启动。

我希望它们仅在它们被选中时启动。 对不起我的语法。 谢谢大家。

这是我的代码:

public class ViewPageContainerFragment extends BaseFragment {
    private ViewPager viewPager;
    private TabLayout tabLayout;
    private final String TAG = getClass().getSimpleName();
    private  ViewPagerAdapter adapter;
    private boolean[] isTabsSelected = new boolean[5];
    private OnTabChangeListener mOnTabChangeListener;
    private int countSelectedTab = 1;
    @Override
    public void init() {
        tabLayout =  (TabLayout)getView().findViewById(R.id.tab_layout);
        viewPager =  (ViewPager) getView().findViewById(R.id.view_pager);
        adapter = new ViewPagerAdapter(getFragmentManager());
    }

    @Override
    public void setEvent() {
        setupViewPager(viewPager);
        isTabsSelected[0] = true;
        tabLayout.setupWithViewPager(viewPager);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                Log.d(TAG, "onPageSelected: "+position);
                if (position != 0) {
                    if (!isTabsSelected[position]
                            && adapter.getItem(position).getChildFragmentManager().getBackStackEntryCount() == 1
                            && getCurrentFragment(position) instanceof OnTabChangeListener) {
                        mOnTabChangeListener = (OnTabChangeListener) getCurrentFragment(position);
                        mOnTabChangeListener.onTabSelected();
                    }
                } else if (adapter.getItem(0).getChildFragmentManager().getBackStackEntryCount() == 1) {
                    Log.d(TAG, "position = 0");
                }
                if (!isTabsSelected[position]) {
                    isTabsSelected[position] = true;
                    countSelectedTab++;
                    viewPager.setOffscreenPageLimit(countSelectedTab);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }

    @Override
    public void setValue() {

    }

    @Override
    public int getLayoutId() {
        return R.layout.fragment_viewpage;
    }
    private void setupViewPager(ViewPager viewPager) {
        adapter.addFrag(new HomeContainerFragment(), "Home");
        adapter.addFrag(new CungHoangDaoContainerFragment(), "Cung Hoàng Đạo");
        adapter.addFrag(new ConGiapContainerFragment(), "12 Con Giáp");
        adapter.addFrag(new TuViContainerFragment(), "Tử Vi");
        viewPager.setAdapter(adapter);
    }
    public Fragment getCurrentFragment(int position) {
        FragmentManager fm = getChildFragmentManager();
        return fm.findFragmentById(R.id.container_framelayout);
    }
    public interface OnTabChangeListener {
        void onTabSelected();
    }
}

【问题讨论】:

  • 将您的代码发布到您调用这些标签片段的位置
  • 我在帖子上有更新代码,太感谢了!
  • setOffscreenPageLimit() won't work to meet only start when is slectedpageLimit 表示应保留到任一侧的页数视图层次结构中的当前页面处于空闲状态,即FragmentA+B+C,如果设置limit==1,那么Fragment B 将在第一次启动时加载A。这应该是答案Viewpager Lazy load data

标签: android android-fragments


【解决方案1】:

ViewPager 默认预加载多个页面以实现更流畅的导航。您可以通过扩展 ViewPager 并覆盖 setOffscreenPageLimit 方法来自定义此行为:

文档链接Here

public void setOffscreenPageLimit(整数限制)

设置在空闲状态下视图层次结构中当前页面任一侧应保留的页面数。超出此范围的页面 将在需要时从适配器重新创建限制。

这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上设置了延迟加载机制,则调整此设置可以提高分页动画和交互的感知流畅度。如果您有少量页面 (3-4) 可以同时保持活动状态,那么在用户页面来回切换时,新创建的视图子树的布局将花费更少的时间。

您应该将此限制保持在较低水平,尤其是当您的网页布局复杂时。此设置默认为 1。

【讨论】:

    【解决方案2】:

    setOffscreenPageLimit() 不起作用。您必须停止 ViewPager 的预加载,这意味着 ViewPager 需要延迟加载数据。就这样。

    public class FragmentSample extends Fragment{
        ...  
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if (isVisibleToUser) {
               // load your data
            }
        }
        ...
    }
    

    【讨论】:

      【解决方案3】:

      在你的 setupViewPager(ViewPager viewPager) 方法中,添加这个 -

      viewPager.setOffscreenPageLimit(1);
      

      来自文档,

      设置应保留到两侧的页数 视图层次结构中的当前页面处于空闲状态。超出此范围的页面 将在需要时从适配器重新创建限制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多