-2

我需要将对象传递给我的片段以初始化它们。目前我正在使用((MyActivity)getActivity()).getX(). (直接访问活动)

但是,我想将所需的对象作为参数传递。

我绝对不想将可打包对象添加到捆绑包中,因为它们需要大量无用的样板代码。我的目标是降低复杂性,而不是增加复杂性。

而且我不想将可序列化对象添加到包中,因为它们很慢并且会导致不必要的开销。

将对象传递给片段的最佳方法是什么?有什么想法可以更方便地解决问题吗?

4

5 回答 5

1

我绝对不想将可打包对象添加到捆绑包中,因为它们需要大量无用的样板代码。我的目标是降低复杂性,而不是增加复杂性。

您在与活动和片段分开的模型类中编写此代码。实施没有复杂性Parcelable。这是将对象传递给Fragment.

还有其他解决方案吗?好吧,((MyActivity)getActivity()).getX()只要您的片段附加到您的活动,您仍然可以执行此操作。在这种情况下,它甚至比Parcelable根本没有序列化更快。

其他方法是将对象写入数据库,将它们的 id 传递给 a Fragment,然后使用查询来检索对象。

您也可以使用SharedPreferences,但很少使用。为此,您需要将对象转换为String.

于 2015-07-31T21:42:29.517 回答
0

我了解您不想将可打包/可序列化对象用于 Bundle。我也同意你的观点,因为我很懒,而且我的手机应用程序越来越复杂。

这是你可以做的,它工作可靠。

  • 在您的 Fragment 类中创建一个公共方法,示例如下。
  • 让 Activity(最好不要在其他地方)调用该公共方法。记住 Activity 总是存在的,Fragments 和 Adapters 可能由于它的生命周期而不存在。
  • 如果您不使用捆绑包,通话时间至关重要。我已经使用它没有任何问题。
  • 这种技术的优点是速度快,尤其是与 Bundles 相比。然而,许多开发人员不考虑这一点。
  • 注意:如果您使用简单的基本 Java 类型,请使用 Bundles!正如谷歌所建议的那样。

示例代码:

public class MyFragment extends Fragment {
...
   public void setList(final ArrayList<String> arrayList) {
   ...
   }

在活动中:

MyFragment fragment1 = MyFragment.newInstance(<parameters>);
fragment1.setList( arrayList );
于 2015-07-31T21:42:49.000 回答
0

你可以做Android的方式:Parcelable。

然后就可以序列化了。

你可以做坏事:静态

您可以使用保留的方式:使用 setRetainInstance(true) 创建一个片段并保存您的对象引用。

于 2015-07-31T21:40:51.530 回答
0

一旦在片段上设置了属性,您是否需要更改它们?如果没有,您可以使用 setArguments(Bundle)。如果它是一个相当轻的对象,您甚至可以跳过实现 Parcelable 并单独设置每个属性。优点是参数在方向改变时被保留。缺点是您需要在附加片段之前调用此方法,因此一旦使用片段,它就不是很有用。

于 2015-08-01T01:09:40.997 回答
0

我的回答为时已晚,但如果其他人想知道的话。推荐的方法是使用 Parcelable 或 Serializable,但你总是可以这样做:

public class ObjectManager {

    private static final String TAG = "ObjectManager";

    private static ObjectManager instance;

    private Object currentObject;

    public static ObjectManager getInstance() {
        if (instance == null)
            instance = new ObjectManager();
        return instance;
    }

    public Object getCurrentObject() {
        return currentObject;
    }

    public void setCurrentObject(Object object) {
        this.currentObject = object;
    }
}

然后使用它:只要您的应用程序正在运行,您就可以在需要的地方使用它

//Use on the object you would like to save
ObjectManager.getInstance().setCurrentObject(object);

//Get the instance from pretty much everywhere 
Object = ObjectManager.getInstance().getCurrentObject();

您可以始终使用它,但如果您传递大于 Bundle 最大大小的对象,它最有可能是有用的。

于 2019-11-12T15:57:15.677 回答