将对象作为参数传递给片段的最佳方式

Best way to pass objects to fragments as parameter

我需要将对象传递给我的片段以初始化它们。 目前我正在使用 ((MyActivity)getActivity()).getX() 进行此操作。 (直接进入activity)

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

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

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

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

您可以采用 Android 方式:Parcelable。

然后就可以连载了

你可以采用糟糕的方式:static

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

I definitely do not want to add parcelable objects to the bundle, since they require an excessive amount of useless boilerplate code. My goal is to reduce complexity, not increasing it.

您将这段代码写在您的模型中 类,它与您的活动和片段分开。实施 Parcelable 并不复杂。这是将对象传递给 Fragment.

的常用方法

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

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

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

我知道您不想将可打包/可序列化的对象用于 Bundle。我也同意你的看法,因为我变懒了,我的 phone 应用程序变得越来越复杂。

以下是您可以执行的操作,它运行可靠。

  • 在您的 Fragment class 中创建一个 public 方法,示例如下。
  • 有Activity,最好没有别的地方,调用那个public方法。请记住 Activity 始终存在,片段和适配器可能由于其生命周期而不存在。
  • 如果您不使用 Bundle,调用的时机至关重要。我已经使用它没有任何问题。
  • 这种技术的优点是速度快,尤其是与捆绑包相比。然而,许多开发人员并不考虑这一点。
  • 注意:如果您使用简单的基础 Java 类型,请使用捆绑包!根据 Google.
  • 的建议

示例代码:

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

中Activity:

MyFragment fragment1 = MyFragment.newInstance(<parameters>);
fragment1.setList( arrayList );

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

我的回答太迟了,但如果有人想知道的话。推荐的方法是使用 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 最大大小的对象,它最有可能有用。