选择相邻选项卡时,是否会调用onCreateView for tab?

时间:2016-03-17 09:27:03

标签: java android view tabs android-tablayout

我遇到一个奇怪的问题,每次导航到onCreateView中的相邻标签时,都会调用TabLayout。这是我的代码:

news_feed.java:

private static TabLayout tabLayout;

@Override
public void onCreate(Bundle savedInstanceState) {
    tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Public"));
    tabLayout.addTab(tabLayout.newTab().setText("Friends"));
    tabLayout.addTab(tabLayout.newTab().setText("My Tabs"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

PublicTab.java:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    System.out.println("Creating a new view");
    fragmentView = inflater.inflate(R.layout.public_tab, container, false);
    progressOverlay = fragmentView.findViewById(R.id.progress_overlay);
    AndroidUtils.animateView(progressOverlay, View.VISIBLE, 0.9f, 200);
    getPublicPosts(progressOverlay, fragmentView);
    return fragmentView;
}

我有3个其他标签看起来与PublicTab.java完全相同,但布局不同。我不确定为什么频繁调用onCreateView。我认为在生命周期中,onCreateView仅被调用有两个原因:  1.当我们第一次初始化选项卡时  2.如果我们来自onStoponPause方法。

但是,当在实际标签旁边的标签之间切换时,println消息会像上面一样被调用,这不是我想要的,因为我不想更新{{1这个片段如此频繁:仅在上面的前两个原因中。任何人都知道为什么会这样吗?任何帮助,将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:2)

使用setoffScreenPageLimit Android文档:

  

public void setOffscreenPageLimit (int limit)

     

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

     

默认值设置为1。

答案 1 :(得分:0)

首先,Viewpager的默认工作属性是这个。 如果您有大约十个选项卡,那么您可以选择第二个选项卡。

viewpager将创建tab2,tab1和tab 3.这样可以在viewpagers之间提供平滑的导航。无论你做什么,你的oncreate视图都会被调用,因为它每次都会重新创建片段。

您可以做的一件事是,如果您在第一次创建标签后重新访问标签,则不会在网上拨打网络电话或从网上获取数据。

你可以这样做。

将数据保存在TabLayout活动中,使用界面创建setdata和getData方法。

所以每当它到达onCreateview。检查get方法中是否还有任何数据,将位置传递给方法。

如果存在则显示该数据,否则进行网络呼叫。