Fragment的构造函数
来源:互联网 发布:python random.choice 编辑:程序博客网 时间:2024/04/30 08:45
1、Fragment初始化
一定要提供默认构造函数。
不能用构造函数传递参数!不要写带参数的构造函数。参数通过下面介绍的方式传递。
原因:Fragment会被重新销毁(Activity销毁的时候它里面的Fragment就被销毁了,可能因为内存不足,手机配置发生变化,横竖屏切换)。在重新创建的时候系统调用的是无参构造函数。
标准做法是:
在Fragment里添加获取Fragment的newInstance函数,以后获取Fragment就使用这个函数,不要使用构造函数新建Fragment!
public
static
MyFragment newInstance(Bundle args) {
MyFragment f =
new
MyFragment();
f.setArguments(args);
return
f;
}
Fragment内部在初始化的时候需要获取外界传递的参数,这时候就用getArguments获取Bundle,再从Bundle里获取对应的参数。Bundle在Fragment销毁和重新创建的时候持续保存。
比如:
private
TextView mTextView;
@Override
public
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment, container,
false
);
initViews(view);
return
view;
}
private
void
initViews(View view){
mTextView = view.findViewById(R.id.tv);
Bundle bundle = getArguments();
mTextView.setText(bundle ==
null
? : bundle.getString(text));
}
Activity里使用MyFragment时应该这样写:
Bundle args =
new
Bundle();
args.putString(text,Hello);
MyFragment f = MyFragment.newInstance(args)
其实还是有点小问题,具体见第5点。
2、关于getActivity()
Fragment的方法getActivity()只在被关联到Activity之后才会得到结果,也就是在onAttach和onDetach两个生命周期之间会非空(此时isAdded返回值是true)。其他时候不应该使用Activity!如果要使用,那说明你设计得不好。使用所依附的Activity时应该判断getActivity是否为空或者isAdded是否为true。
Fragment依附的Activity随时可能被destroy掉!很多时候是在不经意间。机型适配的时候就会发现。
3、Activity引用
Fragment里不应该保留Activity引用!需要用到的时候通过getActivity()获取,因为那个引用不仅会导致内存泄露,而且在你用的时候,那个Activity可能已经不是正在显示的那个Activity了,这个Fragment也可能已经不是正在显示的那个Fragment了。4、关于生命周期
通过add添加Fragment会触发Fragment生命周期,hide和show不会触发生命周期。
像微信那样,一个Activity里有四个Fragment,下面四个按钮,点击一个按钮显示其中一个Fragment。这种情况下,为了优化性能,你可以这样做:
起初只add第一个Fragment,其余三个Fragment都不添加。点击某个标签的时候先看对应的Fragment是否已经添加,没有则new一个并add这个Fragment,隐藏其他所有Fragment;如果已经添加了就直接show这个Fragment,隐藏其他所有Fragment。
5、关于Fragment销毁和重建
(1)Activity因内存不足、配置变化等原因被销毁的时候,包含的Fragment也会被销毁,无论此Fragment是否有id,系统都会调用Fragment的onSaveInstanceState,并且保留之前setArguments的Bundle,并且Activity的FragmentManager里的Fragment会被记录。
(2)由于(1)的原因,如果一个Activity里的fragment是通过add方式添加的,那么如果出现上述情况,就必须在Activity的add地方判断是否应该重新添加Fragment,避免重复添加。
(3)刚刚在第1点时说到Fragment在Activity中的使用。那个地方说得还是有点问题。其实应该给每个Fragment设一个tag,在FragmentTransaction.add方法添加Fragment的时候,第三个参数使用这个tag。初始化的时候,应该先从FragmentManager里查看这个Fragment是否已经有,如果有就直接使用原来的,如果没有再新建。
系统在重建Activity时会重建Fragment(调用Fragment的默认构造函数),并且将这些添加到FragmentManager里,并且设置之前setArguments时使用的Bundle。此时系统回调Fragment的onCreate(Bundle)、onActivityCreated(Bundle)、onViewStateRestored(Bundle)这类方法的时候,参数不为空。
注意:新建的Fragment和原来对应的Fragment不是同一个实例!
Activity内正确使用Fragment的代码如下:
FragmentManager fm = getSupportFragmentManager();
Fragment ft = fm.findFragmentByTag(MyFragment);
Bundle args =
new
Bundle();
args.putString(text,Hello);
MyFragment = ft ==
null
? MyFragment.newInstance(args) : (MyFragment)ft;
if
(savedInstanceState==
null
){
fm.beginTransaction()
.add(R.id.fragment, ft, MyFragment)
.commitAllowingStateLoss();
}
- Fragment的构造函数
- Fragment的构造函数
- Android Fragment的构造函数
- android中Fragment的构造函数
- 关于fragment的构造函数问题
- android中Fragment的构造函数
- Android Fragment 构造函数
- Fragment使用带参数的构造函数遇到的问题
- 谈谈Fragment的构造函数、重新创建(recreate)及相关
- Fragment不推荐使用自定义带参的构造函数
- android关于fragment的构造函数用法建议
- Fragment ,必须要一个空的构造函数
- android Fragment里的newInstance和构造函数
- Android中Fragment的构造函数 his fragment should provide a default constructor
- 关于fragment空构造函数错误
- android fragment 构造函数非public
- 创建Fragment使用 构造函数 还是 newInstance()
- Fragment构造函数和传参
- 如何使用javadoc
- App installation failed A valid provisioning profile for this executable was not found.
- C++的数组和指针
- Android 待机功能流程分析
- iOS上传错误 ERROR ITMS-90049 立即解决方法
- Fragment的构造函数
- UIView —— 所有控件的载体
- Boot strap 垂直居中
- 房屋中介信息管理平台
- Linux memcached安装
- const T、const T*、T *const、const T&和const T*&的区别
- SelectionSort -- 选择排序(C++)
- Android Studio 学习笔记
- C++ primer 学习笔记——迭代器