为什么Fragment实例化后,不序列化数据时,仅推荐用setArguments()传参?

2026-04-02 02:271阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计803个文字,预计阅读时间需要4分钟。

为什么Fragment实例化后,不序列化数据时,仅推荐用setArguments()传参?

为什么使用 `fragment.new` 创建实例后,只推荐使用 `getArguments()` 获取数据,而不是在不想使用序列化的情况下如何解决?

在 Android 开发中,使用 `fragment.new` 创建 `Fragment` 实例后,推荐使用 `getArguments()` 获取数据是因为 `Fragment` 在创建时可以携带一些参数,这些参数是通过 `Fragment` 的构造函数传递的。`getArguments()` 方法提供了一个安全的方式来访问这些参数,因为它会返回一个 `Bundle` 对象,该对象包含了传递给 `Fragment` 的所有参数。

如果不希望使用序列化的方式传递数据,可以通过以下几种方法解决:

1. 直接传递对象: 如果传递的对象不是序列化的,可以直接在创建 `Fragment` 实例时传递这些对象。例如:

java TabVideoFragment tab1VideoFragment=new TabVideoFragment(); tab1VideoFragment.setDefaultStoreList(list);

这种方法适用于传递基本数据类型或实现了 `Serializable` 接口的对象。

2. 使用接口: 如果传递的对象包含复杂的数据结构,可以考虑使用接口来传递数据。例如,定义一个接口来获取所需的数据:

java public interface DataProvider { List getVideoList(); }

为什么Fragment实例化后,不序列化数据时,仅推荐用setArguments()传参?

TabVideoFragment tab1VideoFragment=new TabVideoFragment(); tab1VideoFragment.setDataProvider(new DataProvider() { @Override public List getVideoList() { return list; } });

3. 使用回调: 如果不想在创建 `Fragment` 时传递数据,可以使用回调机制。`Fragment` 可以定义一个回调接口,并在需要数据时通过回调获取:

java public interface OnDataReceivedListener { void onDataReceived(List data); }

TabVideoFragment tab1VideoFragment=new TabVideoFragment(); tab1VideoFragment.setOnDataReceivedListener(new OnDataReceivedListener() { @Override public void onDataReceived(List data) { list=data; // 更新 UI 或其他操作 } });

通过以上方法,可以在不使用序列化的情况下安全地传递数据给 `Fragment`。


为什么fragment new出来之后只推荐使用getArguments()获取数据在不想使用序列化的时候如何解决

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);//当内存中有一个的时候无效

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()传递一些数据进去,可是会发现获取为空,是见鬼了么?不?

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

.TabVideoFragment: HASHCODE:44966402

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

本文共计803个文字,预计阅读时间需要4分钟。

为什么Fragment实例化后,不序列化数据时,仅推荐用setArguments()传参?

为什么使用 `fragment.new` 创建实例后,只推荐使用 `getArguments()` 获取数据,而不是在不想使用序列化的情况下如何解决?

在 Android 开发中,使用 `fragment.new` 创建 `Fragment` 实例后,推荐使用 `getArguments()` 获取数据是因为 `Fragment` 在创建时可以携带一些参数,这些参数是通过 `Fragment` 的构造函数传递的。`getArguments()` 方法提供了一个安全的方式来访问这些参数,因为它会返回一个 `Bundle` 对象,该对象包含了传递给 `Fragment` 的所有参数。

如果不希望使用序列化的方式传递数据,可以通过以下几种方法解决:

1. 直接传递对象: 如果传递的对象不是序列化的,可以直接在创建 `Fragment` 实例时传递这些对象。例如:

java TabVideoFragment tab1VideoFragment=new TabVideoFragment(); tab1VideoFragment.setDefaultStoreList(list);

这种方法适用于传递基本数据类型或实现了 `Serializable` 接口的对象。

2. 使用接口: 如果传递的对象包含复杂的数据结构,可以考虑使用接口来传递数据。例如,定义一个接口来获取所需的数据:

java public interface DataProvider { List getVideoList(); }

为什么Fragment实例化后,不序列化数据时,仅推荐用setArguments()传参?

TabVideoFragment tab1VideoFragment=new TabVideoFragment(); tab1VideoFragment.setDataProvider(new DataProvider() { @Override public List getVideoList() { return list; } });

3. 使用回调: 如果不想在创建 `Fragment` 时传递数据,可以使用回调机制。`Fragment` 可以定义一个回调接口,并在需要数据时通过回调获取:

java public interface OnDataReceivedListener { void onDataReceived(List data); }

TabVideoFragment tab1VideoFragment=new TabVideoFragment(); tab1VideoFragment.setOnDataReceivedListener(new OnDataReceivedListener() { @Override public void onDataReceived(List data) { list=data; // 更新 UI 或其他操作 } });

通过以上方法,可以在不使用序列化的情况下安全地传递数据给 `Fragment`。


为什么fragment new出来之后只推荐使用getArguments()获取数据在不想使用序列化的时候如何解决

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);//当内存中有一个的时候无效

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()传递一些数据进去,可是会发现获取为空,是见鬼了么?不?

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

.TabVideoFragment: HASHCODE:44966402

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