Fragment基本使⽤
Fragment是Android3.0后引⼊的⼀个新的API,他出现的初衷是为了适应⼤屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠⼉,⽽且我们普通⼿机开发也会加⼊这个Fragment, 我们可以把他看成⼀个⼩型的Activity,⼜称Activity⽚段!Fragment静态使⽤
fragment我们可以在xml布局⽂件中像UI控件⼀样使⽤。
android:name=\"com.example.basic.LeftFragment\" android:layout_width=\"match_parent\" android:layout_height=\"match_parent\" /> 注意点: 静态fragment不能再嵌套fragment;静态加载⼀旦添加就不能在运⾏时删除;静态fragment 在onInflate() 中初始化; fragment⼀定要有⼀个⽆参构造⽅法。原因如下: @Deprecated@NonNull public static Fragment instantiate(@NonNull Context context, @NonNull String fname, @Nullable Bundle args) { //... Class extends Fragment> clazz = FragmentFactory.loadFragmentClass( context.getClassLoader(), fname); Fragment f = clazz.getConstructor().newInstance(); if (args != null) { args.setClassLoader(f.getClass().getClassLoader()); f.setArguments(args); } return f;} Fragment动态使⽤ Fragment动态使⽤的操作如下: 获得FragmentManager对象,通过getSupportFragmentManager();获得FragmentTransaction对象,通过fm.beginTransaction();调⽤add()⽅法或者repalce()⽅法加载Fragment;最后调⽤commit()⽅法提交事务。 使⽤注意点与常见异常 注意点 Fragment的onCreateView()⽅法返回Fragment的UI布局,需要注意的是inflate()的第三个参数是false; 如果在创建Fragment时要传⼊参数,必须要通过setArguments(Bundle bundle)⽅式添加,⽽不建议通过为Fragment添加带参数的构造函数; 可以在Fragment的onAttach()中通过getArguments()获得传进来的参数。如果要获取Activity对象,不建议调⽤getActivity(),⽽是在onAttach()中将Context对象强转为Activity对象;commit⽅法⼀定要在Activity.onSaveInstance()之前调⽤;FragmentManager拥有回退栈(BackStack)。 异常 1. getActivity() == null 原因:在⽹络请求返回数据后,页⾯已经关闭时,调⽤getActivity()会返回null。解决⽅案: 不建议fragment要使⽤宿主activity getActivity。 @Override public void onAttach(Context context) { super.onAttach(context);} 2. Can not perform this action after onSaveInstanceState解决⽅案: a. 不能在onSaveInstanceState之后的⽣命周期⾥⾯commit fragment ; b. 不要在⼦线程commit fragment 已经⾛完onSaveInstanceState。3. Fragment重叠原因: 屏幕旋转 activity ⽣命周期⽅法重新执⾏,⽽Fragment⼜具有⾃我恢复机制,故导致多次添加了该fragment。 不配置 \"android:configChanges\"时, a. 竖屏--->横屏 ---> Activity重新执⾏1次⽣命周期b. 横屏--->竖屏 ---> Activity重新执⾏2次⽣命周期 配置 \"android:configChanges\"相关属性后,不会再执⾏⽣命周期,只会调⽤onConfigurationChanged()。 2. 系统内存不⾜时会将切换⾄后台的app杀死,再次切换到前台时作恢复处理。解决⽅案: a. 在onSaveInstanceState()中注释掉super(缺点:activity失去⾃动存储的功能) b. 添加fragment前,先判断savedInstanceState是否为null // 添加fragment前,先判断savedInstanceState是否为nullif (savedInstanceState == null) { // add fragment} setRetainInstance 如果想叫⾃⼰的Fragment即使在其Activity重做时也不进⾏销毁那么就要设置setRetainInstance(true)。进⾏了这样的操作后,⼀旦发⽣Activity重组现象,Fragment会跳过onDestroy直接进⾏onDetach(界⾯消失、对象还在),⽽Framgnet重组时候也会跳过onCreate,⽽onAttach和onActivityCreated还是会被调⽤。需要注意的是,要使⽤这种操作的Fragment不能加⼊backstack后退栈中。并且,被保存的Fragment实例不会保持太久,若长时间没有容器承载它,也会被系统回收掉的。 因篇幅问题不能全部显示,请点此查看更多更全内容