TabLayout
Tablayout继承自HorizontalScrollView,用作页面切换指示器,因使用简便功能强大而广泛使用在App中。
TabLayout中如何让当前标签永远位于屏幕中间?
TabLayout如何设置指示器的宽度包裹内容?
https://www.jianshu.com/p/fde38f367019
tabMode有两种属性:fixed和 scrollable;fixed:指的是固定tab;scrollable指的是tab可滑动。
tabGravity有两种属性:center和fill;center指的是居中显示,fill指的是占满全屏。
viewPager
会缓存前后2个界面
FragmentPagerAdapter
FragmentStatePagerAdapter
Fragment如果在Adapter中使用应该如何解耦?
setOffscreenPageLimit(0)
https://blog.csdn.net/nicholas_nick/article/details/50461276
PagerAdapter闪屏坑的修复
https://www.jianshu.com/p/29b708c62b33
https://www.cnblogs.com/fuyaozhishang/p/7079151.html
使用PagerAdapter时,无法动态更新数据
https://blog.csdn.net/u013040434/article/details/71159784
Android Viewpager PagerAdapter update data 刷新界面数据
https://www.cnblogs.com/fansen/p/5577609.html
https://www.jianshu.com/p/266861496508
Fragment
轻量切换,解决activity间切换不流畅问题
commitAllowingStateLoss
fragment是依赖于activity的,不能独立存在
生命周期和activity绑定
Fragment——onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach
oncreateview()
inflate()
第三个参数是false,因为在fragment内部实现中,会把该布局添加到container中,如果设为true,那么会重复添加,会抛一吃
传参数要用setArguments()
因为在内存紧张导致fragment被系统杀死,并恢复时时能保留这些数据
不能用构造方法传值
onAttach()
将context对象强转为Activity对象
commit()操作是异步的
commitNow()
commitAllowingStateLoss()
add()
remove()
replace()
旧Fragment调用remove,新Fragment调用add
findFragmentByTag
回退栈BackStack
BackStackRecord类包含了一次事务的整个操作轨迹,以链表形式存在
Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?
- Fragment 的事物管理器内部维持了一个双向链表结构,该结构可以记录我们每次 add 的
- Fragment 和 replace 的 Fragment,然后当我们点击 back 按钮的时候会自动帮我们实现退栈操作。
通信用eventbus
DialogFragment,代替Dialog
优点 即使旋转屏幕,也能保留对话框状态
Fragment 的好处
- Fragment 可以使你能够将 activity 分离成多个可重用的组件,每个都有它自己的生命周期和UI。
- Fragment 可以轻松的创建动态灵活的 UI 设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
- Fragment 是一个独立的模块,紧紧地与activity 绑定在一起。可以运行中动态地移除、加入、交换等。
- Fragment 提供一个新的方式让你在不同的安卓设备上统一你的 UI。
- Fragment 解决 Activity 间的切换不流畅,轻量切换。
如何切换 fragement,不重新实例化
- 正确的切换方式是 add(),切换时 hide(),add()另一个 Fragment;
- 再次切换时,只需 hide()当前, show()另一个
懒加载
setUserVisibleHint
Fragment 在 ViewPager 里面的生命周期,滑动 ViewPager 的页面时 Fragment 的生命周期的变化
Fragment/getSupportFragmentManager/FragmentTransaction
add():向Activity加入一个片段,这个片段在activity容器中有他自己的视图/FrameLayout。
hide():隐藏Fragment,已经添加到父容器中的Fragment有关,隐藏Fragment的View/FrameLayout。
show():显示被隐藏的Fragment,这仅仅对已经添加到activity中的Fragment有关,显示Fragment的View。
detach():Fragment的视图被销毁,但是它的状态没有被销毁,还是被FragmentMenager管理。
attach():Fragment的view重新加载到UI视图中,并显示,也就是执行onCreateView()→onActivityCreate()→onStart()→onResume()。
replace():就相当于执行remove(Fragment)→add(int, Fragment, String)这两个方法
setOffscreenPageLimit
一是 ViewPager 会预加载几页; 二是 ViewPager 会缓存 2*n+1 页(n为设置的值)。如设置为n=1,当前在第一页,会预加载第二页,滑倒第二页,会预加载第三页,当滑倒第三页,第一页会销毁,第四页会加载
ViewPager循环、自动滚动效果
https://blog.csdn.net/weixin_44339238/article/details/101761004