java onCreateView,用于在选择相邻选项卡时调用选项卡?
我遇到了一个奇怪的问题,每次我导航到我的TabLayout
中相邻的选项卡时都会调用onCreateView
。这是我的密码:
新闻联播。爪哇:
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) {
}
});
}
公共选项卡。爪哇:
@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
消息会像上面那样调用,这不是我想要的,因为我不想如此频繁地更新该片段的View
:仅在上面的前两个原因期间。有人知道为什么会这样吗?任何帮助都将不胜感激!谢谢
# 1 楼答案
首先也是最重要的是,Viewpager的默认工作属性是。 如果您有大约十个选项卡,并且您选择了第二个选项卡
viewpager将创建选项卡2、选项卡1和选项卡3。这样可以在ViewPager之间提供平滑的导航。所以无论您做什么,oncreate视图都会被调用,因为它每次都会重新创建片段
您可以做的一件事是,如果您不想在每次创建选项卡后重新访问选项卡时进行网络呼叫/或从联机获取数据
你可以这样做
在TabLayout活动中保存数据,使用接口创建setdata和getData方法
因此,每当它到达onCreateview时。检查get方法中是否还有任何数据,并将位置传递给该方法
如果存在,则显示该数据,否则进行网络呼叫
# 2 楼答案
使用setoffScreenPageLimit Android文档: