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

时间:2015-07-31 21:27:14

标签: android android-fragments android-activity bundle instancestate

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

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

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

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

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

5 个答案:

答案 0 :(得分:0)

你可以采用Android方式:Parcelable。

您可以序列化。

你可以做得很差:静态

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

答案 1 :(得分:0)

  

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

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

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

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

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

答案 2 :(得分:0)

我知道您不希望将parcelable / serializable对象用于Bundle。我也很同意你,因为我很懒,我的手机应用程序变得越来越复杂。

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

  • 在Fragment类中创建一个公共方法,如下所示。
  • 让活动,最好没有其他地方,称之为公共方法。记住,活动始终存在,碎片和适配器可能不会因其生命周期而存在。
  • 如果您不使用Bundles,则通话时间至关重要。我没有任何问题地使用它。
  • 这项技术的优点是速度快,特别是与Bundles相比。然而,许多开发人员并未考虑这一点。
  • 注意:如果您使用的是简单的基本Java类型,请使用Bundles!正如Google所建议的那样。

示例代码:

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

在活动中:

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

答案 3 :(得分:0)

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

答案 4 :(得分: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最大大小,则很有用。