我遇到一个奇怪的问题,每次导航到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.如果我们来自onStop
或onPause
方法。
但是,当在实际标签旁边的标签之间切换时,println
消息会像上面一样被调用,这不是我想要的,因为我不想更新{{1这个片段如此频繁:仅在上面的前两个原因中。任何人都知道为什么会这样吗?任何帮助,将不胜感激!谢谢!
答案 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方法中是否还有任何数据,将位置传递给方法。
如果存在则显示该数据,否则进行网络呼叫。