【问题标题】:How to pass/share object from fragment to fragment?如何在片段之间传递/共享对象?
【发布时间】:2014-11-08 20:04:39
【问题描述】:

我想将 实时对象fragment 传递给 fragment

传递数据

我没有找到办法。

我认为唯一的方法是有意但我不确定。

我阅读了单例模式、接口和捆绑包、全局变量

我想看看是否可以使用 share/pass object 从一个fragment 到第二个fragment。非常感谢。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    通过实现模型bean ParcelableSerializable 接口可以实现在活动或片段之间传递真实对象。

    Parcelable: Parcel 类似于 Bundle,但更复杂,可以支持更复杂的类序列化。应用程序可以实现Parcelable 接口来定义可以传递的特定于应用程序的类,尤其是在使用服务时。

    你可以在这篇文章here看到如何实现Parcelable接口。

    public class Foo implements Parcelable {
       ...
    }
    

    Serializable:可序列化接口是java标准序列化。你可以阅读更多关于它的信息here

    public class Foo implements Serializable {
    
        private static final long serialVersionUID = 0L;
       ...
    }
    

    假设您有一个类Foo 正确实现了 Parcelable,以将其放入 Activity 中的 Intent 中:

    Intent intent = new Intent(getBaseContext(), NextActivity.class);
    Foo foo = new Foo();
    intent.putExtra("foo", foo);
    startActivity(intent);
    

    从另一个活动的意图中获取它:

    Foo foo = (Foo) getIntent().getExtras().getParcelable("foo");
    

    ** 编辑 **

    正如最初的问题所要求的片段,那么它就是这样工作的:

     Fragment fragment = new Fragment();
     Foo foo = new Foo();
    
     Bundle bundle = new Bundle();
     bundle.putParcelable("Foo", foo);
     fragment.setArguments(bundle); 
    

    从另一个片段中的捆绑包中获取它:

    Foo foo = (Foo) bundle.getParcelable("Foo");
    

    希望这会有所帮助!

    【讨论】:

    • 我不需要提取/分解对象来键入变量int,string,boolean etc..@Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(varible1); dest.writeInt(varible2); dest.writeString(varible3); dest.writeString(varible4); }然后从每个变量中收集所有值。我需要将对象作为一个单元对象与所有方法一起传输/传递/共享。
    • Android Dalvik (DVM) 在许多方面与 JVM 不同,您可以在 post 中看到。每个应用程序在 DVM 中都有自己的实例,这意味着多个活动应用程序需要多个 DVM 实例。话虽如此,与不同进程共享静态内存并不是一个好主意,也不能保证对象状态在内存中的生命周期。 DVM还有一个类似于Java实现JVM的自动垃圾收集器。
    • 为了解决这个问题,Java 为编组/解组提供序列化以保持对象状态。但是android提供了自己的接口Parcelable,比Serializable效率更高。我建议阅读有关编组/解组的内容here。根据Android指南,activity/fragment之间的对象传递只能通过Parcelable/Serializable来实现。所有其他方法各有利弊。
    • 该链接用于在活动或活动和片段之间传递对象,问题是关于在片段之间传递对象。
    • 如果我想将 Parcelable 对象从 Fragment 传递到 Activity 怎么办?
    【解决方案2】:
    • 将对象从一个 Fragment 传递到另一个 Fragment 可以通过使用这些简单的步骤来实现:
    • 首先,您必须将模型类设为 Parcelable:

      class Car implements Parcelable

    • 然后实现Parcelable类的覆盖函数:e-g

      @Override
      public int describeContents() {
          return 0;
      }
      
      @Override
      public void writeToParcel(Parcel parcel, int i) {
      
      }
      
    • 从第一个片段开始:

      //设置要传递的数据

      MyFragment fragment = new MyFragment(); //Your Fragment
      Car car = new Car(); // Your Object 
      Bundle bundle = new Bundle();
      bundle.putParcelable("carInfo", car)  // Key, value
      fragment.setArguments(bundle); 
      

      // 将数据传递给其他Fragment

      getFragmentManager()
             .beginTransaction()
             .replace(R.id.container, fragment)
             .commit();`
      
    • 第二个片段

      @Override
      public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
      
         Bundle bundle = this.getArguments();
         if (bundle != null) {
             Car receivedCar = bundle.getParcelable("carInfo"); // Key
         } 
      }
      

      希望它会有所帮助:)

    【讨论】:

      【解决方案3】:

      还有另一种方法可以通过简单的 setter 函数来传递对象。 从您当前的片段制作目标片段的对象。你的目标片段应该有一个像

      这样的setter函数
      public void setObjectFunction(Object obj){this.mObj = obj}
      
      YourFragment yourFragment = new YourFragment();
      Object  passingObj = new Object();
      yourFragment.setObjectFunction(passingObj);
      

      然后

      getFragmentManager()
         .beginTransaction()
         .replace(R.id.container, yourFragment)
         .commit();`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        • 2020-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多