您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页Fragment基本使用及存在的bug

Fragment基本使用及存在的bug

来源:飒榕旅游知识分享网
Fragment基本使⽤及存在的bug

Fragment基本使⽤

Fragment是Android3.0后引⼊的⼀个新的API,他出现的初衷是为了适应⼤屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠⼉,⽽且我们普通⼿机开发也会加⼊这个Fragment, 我们可以把他看成⼀个⼩型的Activity,⼜称Activity⽚段!Fragment静态使⽤

fragment我们可以在xml布局⽂件中像UI控件⼀样使⽤。

android:id=\"@+id/fragment_left\"

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 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实例不会保持太久,若长时间没有容器承载它,也会被系统回收掉的。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务