1 fragment加载到Activity的两种方式
1 添加fragment到activity的布局文件当中
2 动态在activity中添加fragment
2 fragmentPagerAdapterFragmentStatePagerAdapter区别?
-
FragmentPagerAdapter:该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter
解绑定而已 -
FragmentStatePagerAdapter:该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。
这里写图片描述
3fragment通信
frgment调用activity方法 - getActivity(获取绑定在一起的activity的实例)
activity调用fragment方法 - 接口回调
fragment中调用fragment中的方法 - findFragmentById(找到相应的fragment)
4Fragment 的 replace 和 add 方法的区别
add 的时候是把所的 Fragment 一层一层的叠加到了FrameLayout 上了,
replace的首先将该容器中的其他 Fragment 去除掉然后将当前 Fragment
添加到容器中。
5fragment的生命周期
Fragment onCreate 执行完成后才创建Activity
Fragment onViewCreated 执行完Activity才执行onCreate
Fragment onActivityCreated ----> Activity onStart
Fragment onStart ---> Activity onResume
Fragment onPause ---> Activity onPause
Fragment onStop ---> Activity onStop
Fragment onDetach ---> Activity onDestory
Fragment懒加载分析
场景:一个Activity内使用ViewPager包含多个Fragment的情况。由于ViewPager的预加载功能,通过setOffscreenPageLimit(int number) 来设置预加载,默认的预加载是1,但是即使你设置为0,也是不起作用的,设置的只能是大于1才会有效果。这无疑会为性能上带来很大影响。解决这个问题有两种方式,一种是禁止ViewPager的预加载,重写ViewPager,但是该方法会出现左右滑动时会出现卡顿现象,带来不好的用户体验。而另外一种就是我们接下来要讲的通过Fragment的懒加载来实现。当用户切换到某个fragment时再加载。
//通过判断当前的fragment是否可见来判断是否加载网络
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisable = true;
onVisible();
} else {
isVisable = false;
onInVisible();
}
}
protected void onInVisible() {
}
protected void onVisible() {
//加载数据
loadData();
}
protected abstract void loadData();
Fragment嵌套Fragment界面不显示或加载不完整
fragment嵌套fragment,调用getChildFragmentManager
fm = fragment.getChildFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
for(Fragment fragment : fragments) {
ft.add(containerId, fragment);
}
ft.commit();
fragment之添加回退栈
场景:类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity
//添加到任务栈
FragmentTransaction.addToBackStack(String)
//获取任务栈数量
getFragmentManager().getBackStackEntryCount()
//弹出任务栈
getFragmentManager().popBackStack();
Fragment2 f2 = new Fragment2();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.replace(R.id.fl, f2);
//将当前的事务添加到了回退栈
tx.addToBackStack(null);
tx.commit();
//回退到Fragment1
FragmentManager fm = getFragmentManager();
//将当前的事务退出回退栈
fm.popBackStack();
网友评论