一.前言
- 本文基于androidX包下的Fragment,与support包下的Fragment"略"有不同,android.app包下的Fragment已于API 28被废弃
- 这篇文章应该算是一篇使用Fragment后的总结,不会讲特殊的使用技巧和使用角度,不会涉及过深的源码分析,仅仅说明一般业务场景下如何正确使用Fragment
- 很早以前就想写关于Fragment,但是那个时候因为对Fragment没有足够的场景使用积累,学习也只是为了为学习而学习,所以没有多少心得。自从接手了新项目,遇到了一些使用上的坑之后,心得就有了(笑哭),因为Fragment使用起来的确不想Activity那样趁手。所以有了这篇一般使用
二.Fragment初衷
android3.0推出之前,谷歌的开发人员就发现,市面上有很多app在同一个界面上展现是分区块的,不同的区块对应不同的界面展现和交互逻辑,当然也对应着不同的代码处理,可这些代码都是在同一个Activity中,造成Activity的代码很臃肿,不易维护。同时android平板开始兴起,如何在更大的屏幕上呈现更多的内容也是对开发者提出的一个问题。所以Fragment应运而生。就像下图一样,整个屏幕被分成了三个碎片(fragment),每个碎片将有自己不同的UI展现和交互逻辑。
如果仅仅是UI和交互代码交给Fragment,那它还不如叫Adapter。很显然,谷歌希望你能将管理区块的全部处理代码交给Fragment,包括Activity已有的生命周期,所以Fragment也有了生命周期。
三.使用
(一).原则
- 一个Activity尽量在一处代码块统一管理Fragment
- 和Activity一样,不需要由开发者手动调用生命周期
- 尽量像Activity一样将Fragment对象交由系统处理
下面的代码为一个App主页面,底部tab切换的管理类,分别为构造方法和tab切换处理show()方法
public TabbarManager(FragmentActivity fragmentActivity, int fragmentContentId,
int tabCount, ArrayList<MainBaseFragment> fragmentList,
ArrayList<ImageButton> tabImgBtnList,
ArrayList<Drawable> tabImgCkedList, ArrayList<Drawable> tabImgUnckedList) {
this.fragmentActivity = fragmentActivity;
this.fragmentContentId = fragmentContentId;
this.tabCount = tabCount;
this.fragmentList = fragmentList;
this.tabImgBtnList = tabImgBtnList;
this.tabImgCkedList = tabImgCkedList;
this.tabImgUnckedList = tabImgUnckedList;
MainBaseFragment fragment = fragmentList.get(0);
FragmentTransaction fragmentTrans = fragmentActivity.getSupportFragmentManager().beginTransaction();
fragmentTrans.add(fragmentContentId, fragment);
fragmentTrans.commit();
fragment.fragmentDidAppear();
setTabImgBtnSelected(0);
}
public void show(int index) {
if (index < 0 || index >= tabCount) {
return;
}
if (index == lastTabIndex) {
if (fragmentList.size() > lastTabIndex){
BBTMainBaseFragment fragment = fragmentList.get(lastTabIndex);
fragment.onTabReselected();
}
return;
}
FragmentTransaction fragTrans =
fragmentActivity.getSupportFragmentManager().beginTransaction();
for (int i = 0; i < tabCount; i++ ) {
ImageButton imgBtn = tabImgBtnList.get(i);
BBTMainBaseFragment fragment = fragmentList.get(i);
Drawable tabImgCked = tabImgCkedList.get(i);
if ( i == index ) {
// 显示tabbar
imgBtn.setBackground(tabImgCked);
// 显示内容区
if (fragment.isAdded()) {
fragment.fragmentDidAppear();
fragment.onResume();
} else {
fragTrans.add(fragmentContentId, fragment);
fragment.fragmentDidLoad();
}
fragTrans.show(fragment);
fragment.onTabSelected();
} else if ( i == lastTabIndex ) {
// 隐藏tabbar
Drawable tabImgUncked = tabImgUnckedList.get(i);
imgBtn.setBackground(tabImgUncked);
// 隐藏内容区
fragment.onPause();