1、onattach是用来处理什么的?
a、当一个Fragment被附加到一个Activity时,onAttach方法会被调用。用来关联fragment和activity的。
b、通过这个方法可以获得activity的上下文。
2、Fragment的构造函数为啥不让传参?
Fragment的构造器不允许直接传递参数是因为Fragment的实例是由系统通过默认的无参构造器创建的,然后通过setArguments(Bundle)和getArguments()方法来传递参数。这是因为Fragment可能会因为配置更改(如屏幕旋转)而被系统销毁和重新创建,如果使用构造器传参,这些参数可能会丢失。Fragment是用反射的方式创建的,当Fragment因为某种原因重新创建时,会调用到onCreate方法传入之前保存的状态,在instantiate方法中通过反射无参构造函数创建一个Fragment,并且为Arguments初始化为原来保存的值,而此时如果没有无参构造函数就会抛出异常,造成程序崩溃。
解决方法:
使用setArguments(Bundle)和getArguments()方法传递参数:
public static MyFragment newInstance(String myString) {
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
args.putString("myString", myString);
fragment.setArguments(args);
return fragment;
}
public MyFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
String myString = getArguments().getString("myString");
// 使用传递的参数
}
}
使用其他方式管理状态,例如使用ViewModel或持久化存储来保存需要传递的数据,然后在Fragment的onCreate()或其他生命周期方法中恢复这些数据。
3、Fragment add与replace的区别,分别对Fragment的生命周期影响
- 使用 add 添加的 Fragments,可以由开发者自由控制当前应该显示或者隐藏哪个Fragment,其实在源码中就是对应Fragment中View的显示和隐藏。
- 通过replace 添加的 Fragment,replace本质就是将replace操作变为remove、add操作,当前已存在的Fragment被替换时走生命周期销毁流程,传递给replace方法的Fragment走生命周期创建流程。
结论:
当Fragment是不可见时,如果你要保留Fragment中的数据以及View的显示状态,那么可以使用add操作,后续针对不同的状态隐藏和显示不同的Fragment。
优点:快,支持Fragment中View的显示、隐藏
缺点:内存中保留的数据过多,容易导致造成OOM的风险。
当Fragment不可见时,你不需要保留Fragment中的数据和View的显示状态,那么可以使用replace。
优点:节省内存,不需要的数据能立即释放掉
缺点:频繁创建Fragment,也就是频繁走Fragment生命周期创建与销毁流程,造成额外性能开销。