简书链接:为什么fragmentnew出来之后只推荐使用setArguments传递数据在不想使用序列化的时候如何解决
文章字数:242,阅读全文大约需要1分钟
为什么fragment new出来之后只推荐使用getArguments()获取数据在不想使用序列化的时候如何解决

1
2
3
4
5
6
7
8
TabVideoFragment tab1VideoFragment = TabVideoFragment.class.newInstance();
tab1VideoFragment.setDefaultStoreList(list);//当内存中有一个的时候无效
Bundle bundle=new Bundle();
//Cns.INTENT_BOOLEAN
bundle.putBoolean(Cns.INTENT_BOOLEAN,true);
bundle.putBoolean(Cns.INTENT_NEED_FROM_ACTIVITY_FETCH_DATA,list!=null);
tab1VideoFragment.setArguments(bundle);
tab1VideoFragment.setSelectPosition(position);//当内存中有一个的时候无效
1
2
3
4
5
6
7
8
9
10
Bundle arguments = getArguments();
if (arguments != null && arguments.getBoolean(Cns.INTENT_BOOLEAN)) {
mFromActivity = true;
if (arguments.getBoolean(Cns.INTENT_NEED_FROM_ACTIVITY_FETCH_DATA)) {
if (defaultStoreList == null && getActivity() instanceof FetchDataFromParent) {
Object o = ((FetchDataFromParent) getActivity()).fetchData();
defaultStoreList = (List<SmallVideoModel>) o;
}
}
}

有时候可能想写序列化,这个时候我想当然的直接fragment.setObject()传递一些数据进去,可是会发现获取为空,是见鬼了么?不?

1
2
3
4
public TabVideoFragment() {
Log.w(TAG, "HASHCODE:" + this.hashCode());
}

1
2
.TabVideoFragment: HASHCODE:44966402

会发现调用2次,说明什么?当fragmentManager里面有一个fragment的时候他是直接给new一个 然后从参数里取出来,所以你白弄了。。这也是比较方便优化内存吧,存储的数据通过他这么一搞,都给你抖掉
所以我这里用的方式是通过activity的接口来从activity里面拿数据.
另外一种方式就是通过eventbus也是可以拿到数据的。