FragmentManager fragmentManager=getSupportFragmentManager(); FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); fragmentTransaction.add(ViewId,fragment);// 或者fragmentTransaction.replace(ViewId,fragment); fragmentTransaction.commit(); 基础更好一点的同学会用show和hide方法 FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.hide(new FirstFragment()).show(new SecondFragment())
fragment 每次在add/replace或者show/hide都会 new 一个新的实例,这就是致命原因!!!!!
滑动卡顿主要的原因是因为每次切换viewpager的时候,会去缓存设定的页面个数,导致每次都会有fragment里的生命周期被重新调用,一些初始化内容,网络请求等被无限调用。
解决步骤分为两步:
1、首先将viewpager的缓存个数设置为fragment的个数,也就是页面的个数。
例如:viewPager.setOffscreenPageLimit(7);这样可以在第一次创建viewpager和fragment的时候就将所有的页面都缓存,再次切换页面的时候就不会在去缓存已经被缓存的fragment页面。
2、给Fragment写懒加载,只有当前Fragment处于可视窗口的时候会被调用。
重写Fragment的setUserVisibleHint方法,adapter中的每个fragment切换的时候都会被调用,如果是切换到当前页,那么isVisibleToUser==true,否则为false。
3.动态加载模式:
//首先需要先实例好n个全局Fragment //private Fragment currentFragment=new Fragment();(全局) private FragmentTransaction switchFragment(Fragment targetFragment) { FragmentTransaction transaction =getSupportFragmentManager().beginTransaction(); //第一次使用switchFragment()时currentFragment null,所以要判断一下 if (!targetFragment.isAdded()) { if (currentFragment != null) { transaction.hide(currentFragment); } transaction.add(R.id.fragment,targetFragment,targetFragment.getClass().getName()); } else { transaction.hide(currentFragment).show(targetFragment); } currentFragment = targetFragment; return transaction; }
在点击切换Fragment时: @Override public void onTabSelected(@IdRes int tabId) { if (tabId == R.id.tab_one){ switchFragment(first).commit(); } if (tabId == R.id.tab_two){ switchFragment(second).commit(); } if (tabId == R.id.tab_three){ switchFragment(third).commit(); } }
只实例一次,那我的Fragment里的数据要更新怎么办?我的回答是——软件关了再次重启!
好在官方提供了onHiddenChanged方法,每次切换hide或者show时该方法会被执行,可以在这里面更新数据!
//此方法在Fragment中 @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (hidden){ //Fragment隐藏时调用 }else { //Fragment显示时调用 } }
此方法是不是比每次add或replace更新数据执行一大坨的生命周期要优雅的多的多!