目录
Fragment生命周期函数一览
Activity和Fragment的生命周期非常类似,Fragment要更加细分一些,如下图:
由上图可知,所有的生命周期函数必须在 绑定(onAttach) 与 解绑(onDetach) 两者之间执行。
Fragment的生命周期非常重要,在项目中Fragment生命周期的滥用,会导致后台收集到很多的异常,而异常的根本原因是对其生命周期没有按照规则执行,例如:在fragment中从Activity获取的变量为null。
编程感受Fragment生命周期
生命周期难点所在:生命周期的调度原则。
这些生命周期函数并不是每次fragment变化的时候都会全部调用,而是只会调用其中某几个,这就需要我们知道在各种情况下的调用情况。
根据调用情况,我们才清除解析bandle,解析xml,UI复位,清零等等应该放在哪个生命周期函数中。
后面例子中有体现:
onCreate()要对从activity传过来的bundle进行解析等
onCreateView()要解析xml,设置button等
演示所用的代码
代码结构一览:
MainActivity.java
在这里创建了两个按钮的点击事件,点击后创建或者切换不同的fragment。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = findViewById(R.id.btn_1);
button1.setOnClickListener(this);
Button button2 = findViewById(R.id.btn_2);
button2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_1:
Bundle bundle = new Bundle();
//将Activity中的信息放进bundle
bundle.putString("message", "my name is zhua");
//需要实例化一个BlankFragment1对象bf
BlankFragment1 bf = new BlankFragment1();
//数据传入bf中
bf.setArguments(bundle);
//动态切换fragment
replaceFragment(bf);
break;
case R.id.btn_2:
replaceFragment(new BlankFragment2());
break;
}
}
//启动fragment生命周期
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fm, fragment)