Fragment | 青训营笔记
写在前面
这是我参与「第四届青训营 」笔记创作活动的第1天
该笔记为之前断断续续的笔记片段和大项目之后的笔记的整合,复习一些基本知识和在项目中遇到的问题。如有不妥之处,还望予以指正。
知识梳理
Fragment 的使用
Fragment 允许您将界面划分为离散的区块,从而将模块化和可重用性引入 Activity 的界面。
这意味这我们可以将 fragment 当作插件一般,在需要的界面按需布置即可。模块化的 fragment 也更加容易管理。
Fragment 的生命周期
Fragment 的生命周期和 Activity 非常类似,在这里我就没必要赘述。具体可参考下图(图片来源于网络)。
取得 Fragment
Fragment 被调用时,会先调用 onCreate() 创建 fragment,在调用 onCreateView 创建其布局。
此时,我们可以定义一个私有的 View 取得 ViewGroup 中的 fragment ,这时我们就可以通过 view.findViewById() 来取得 fragment 里面的组件,并执行相应的操作。
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment, container, false);
return view;
}
Fragment 的管理
在 Android 中,我们通过 FragmentManager 和 FragmentTransaction 来管理 fragment 。
// 取得 FragmentManager 对象
FragmentManager fragmentManager = getSupportFragmentManager();
// 取得 FragmentTransaction 事务
FragmentTransaction transaction = fragmentManager.beginTransaction();
取得了 FragmentManager 和 FragmentTransaction 之后,我们可以通过下面这些常用的方法来管理 fragment 。
add() 和 remove():添加和移除 fragment。
replace():替换当前的 fragment。
hide() 和 show():隐藏和显示想要的 fragment。
commit():提交事务。
遇到的问题
FragmentTransaction 不可被多次提交
我曾经将 FragmentManager 和 FragmentTransaction 定义为私有属性,方便在类中调用。结果将二者初始化后,即只取得一次 FragmentManager 和 开启一次 FragmentTransaction 。报错,同一事务,无法被多次提交。
Fragment replace() 和 show()
add() 方法添加的 fragment 会被缓存,通过调用 hide() 和 show() 来控制 fragment 的显示。过多的 fragment 会对 APP 的性能造成影响。
replace() 会将旧的 fragment 移除,替换为新的 fragment。
使用 replace() 时发现数据无法保存之后,在需要的页面采用 add() 方法来使 fragment 的数据得以留存,注意 fragment 的数量,以免过多的 fragment 造成额外的开销。