【问题标题】:Passing objects between fragments在片段之间传递对象
【发布时间】:2020-03-20 10:59:28
【问题描述】:

我正在使用带有三个片段菜单的内置导航抽屉活动,我想通过这些片段进行通信意味着想要将数据从一个传递到另一个。我发现有三种可能的方式来与片段进行通信。我也清楚地了解到,片段永远不会直接通信。

  • 使用界面
  • 全局类(扩展应用程序类)
  • 终于使用包

现在我的问题是哪种方式是与片段进行通信的最佳方式,目前我正在使用second method,这是我将所有这些对象(getter&setter 类)放入Globalized objects which extends Application Class 这是正确的方法与否?

【问题讨论】:

  • 你需要通过什么样的vlue?
  • 我需要传递一个对象
  • 序列化您的模型类并将对象与 putSerializable 函数捆绑在一起,以通过片段传递对象。
  • 什么是序列化,它实际上是做什么的?你能解释一下吗?或任何参考
  • 您的活动正在托管这两个片段,那么为什么不将数据也分配给活动呢?您将能够使用 getActivity() 从 Fragments 访问 Activity 成员。

标签: android android-fragments


【解决方案1】:

您可以在您的 Object 类中实现 Serializable,然后简单地使用 bundle 传递它。我假设您正在从 first_fragment 启动 second_fragment。

在你的第一个片段中:

FragmentTransaction ft =  getActivity().getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
Fragment2 fragment2 = new Fragment2();

Bundle bundle = new Bundle();
YourObj obj = SET_YOUR_OBJECT_HERE;
bundle.putSerializable("your_obj", obj);
fragment2.setArguments(bundle);
ft.replace(android.R.id.content, fragment2);
ft.addToBackStack(null);
ft.commit();

在片段二中:

Bundle bundle = getArguments();
YourObj obj= (YourObj) bundle.getSerializable("your_obj");

编辑

要序列化您的对象,只需在您的 Object 类中实现 Serializable。

如果你的 Object 类是 YourObj.class

public class YourObj implements Serializable {
    int id;
    String name;

    // GETTERS AND SETTERS
}

【讨论】:

  • 感谢您的热情回复,让我试试您的回答
  • 我需要一个疑问,我可以使用Bundle bundle = getArguments(); YourObj obj= (YourObj) bundle.getSerializable("your_obj");第二个片段的onCreateView方法中的代码吗??
  • 是的,你可以。您可以在片段中的任何位置使用它。
  • 兄弟,我的另一个问题...帮帮我stackoverflow.com/questions/42340930/…
【解决方案2】:

通过使模型类Serializable或Parcelable,可以在片段和活动之间传递对象。

Parcelable 是一个 Android 类,可以支持更复杂的类序列化。 在这里检查 Parceble 类的实现:http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

Serializable 是一个 Java 类,适用于小对象。 对于可序列化访问这里: https://developer.android.com/reference/java/io/Serializable.html

假设您的模型类是 NewObject,然后在您的片段类中使用以下内容:

Fragment fragment = new Fragment();
NewObject newObject = new NewObject();

Bundle bundle = new Bundle();
bundle.putParcelable("Object", newObject);
fragment.setArguments(bundle); 

要从另一个片段中的捆绑包中获取它,请在 onCreate 函数中使用:

NewObject newObject = (NewObject) bundle.getParcelable("Object");

【讨论】:

    【解决方案3】:

    数据持有者类:

        public class DataHolder implements Serializable{
    
            private String name,id;
    
            public DataHolder(String id, String name) {
                this.id = id;
                this.name = name;
    
            }
    
            public String getId() {
                return id;
            }
    
            public void setId(String id) {
                this.id = id;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }
    

    片段A:

        DataHolder dataholder=new DataHolder("1","TestName");
        Bundle bundle=new Bundle();
        bundle.putSerializable("obj",dataholder);
    
        Fragment fragment=new FragmentB();
        fragment.setArguments(bundle);
        fragmentManager = getActivity(). getSupportFragmentManager();
        fragmentTransaction = fragmentManager .beginTransaction();
        fragmentTransaction.add(R.id.container, fragment);
        fragmentTransaction.commit();
    

    片段B:

       DataHolder dataholder = (DataHolder)getArguments().getSerializable(obj);  
    

    【讨论】:

      【解决方案4】:

      在托管这些片段的 Activity 中,定义一个变量,

      public class HomeActivity{
      
          public User mUser;
          ...
      }
      

      现在,在您的片段中,当您从 Api 获得响应时,在 Activity 中初始化变量 User,如下所示:

      @Override
      public void onClick(View view) {
          JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, getString(R.string.RESTAPI_URL), null, new Response.Listener<JSONObject>() {
      
              @Override
              public void onResponse(JSONObject response) {
                  Log.d("Response: ",response.toString());
                  Gson gson = new Gson();
                  User user = gson.fromJson(String.valueOf(response),User.class);
      
                  // initialise User variable in Home Activity
                  ((HomeActivity)getActivity()).mUser = user;
              }
          }, new Response.ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError error) {
                  Log.d("ErrorResponse: ",error.toString());
              }
          });
            RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
            requestQueue.add(jsonObjectRequest);
      

      }

      假设您的User 类实现了 Parcelable 接口,如果没有,则将该类设为 Parcelable。这与 Java 中的 Serializable 相同,但 Parcelable 针对 Android 进行了优化。

      最后,当您加载第二个片段时,只需将用户对象传递给第二个片段,如下所示:

      SecondFragment secondFragment = new SecondFragment();
      Bundle bundle = new Bundle();
      bundle.putParcelable("ARG_USER", user);
      secondFragment.setArguments(bundle);
      //...code for loading second fragment
      

      【讨论】:

      • 为什么不直接在第二个片段中调用用户变量,就像在第二个片段中初始化它一样?实际上,我之前在片段中做过类似((HomeActivity)getActivity()).mUser = user 的事情,它似乎工作正常。但这真的好吗?我喜欢它,因为它非常简单。
      【解决方案5】:

      当您需要在片段之间传递有限的数据时,您可以使用 Bundle Instance。如果您有复杂的对象要传递,您更喜欢接口而不是其他方式。你也可以查看 ref 的链接

      【讨论】:

        【解决方案6】:

        你可以试试这个方法。。 在你的第一个片段中

        Outlet outlet=New Outlet;
        Bundle bundle = new Bundle();
        bundle.putSerializable("outlet",outlet);
        Fragment frag=null;
        frag=new Outlet_Edit();
        if(frag!=null){
           frag.setArguments(bundle);
           FragmentManager fragmentManager=getActivity().getSupportFragmentManager();
           FragmentTransaction ft=fragmentManager.beginTransaction();
           ft.replace(R.id.sacreenarea,frag);
           ft.commit();
        }
        

        在你的第二个片段中

        //second Fragmnet
        Outlet editing_outlet=(Outlet) getArguments().getSerializable("outlet");
        Log.d("Editing Outlet",editing_outlet.toString());
        

        而Object应该是这样的..

        public class Outlet implements Serializable {
        String id;
        String shopname;
        String shopowner;
        String address;
        String contact;
        String marketid;
        
        public String getId() {
            return id;
        }
        
        public void setId(String id) {
            this.id = id;
        }
        
        public String getShopname() {
            return shopname;
        }
        
        public void setShopname(String shopname) {
            this.shopname = shopname;
        }
        
        public String getShopowner() {
            return shopowner;
        }
        
        public void setShopowner(String shopowner) {
            this.shopowner = shopowner;
        }
        
        public String getAddress() {
            return address;
        }
        
        public void setAddress(String address) {
            this.address = address;
        }
        
        public String getContact() {
            return contact;
        }
        
        public void setContact(String contact) {
            this.contact = contact;
        }
        
        public String getMarketid() {
            return marketid;
        }
        
        public void setMarketid(String marketid) {
            this.marketid = marketid;
        }
        
        @Override
        public String toString() {
            return "Outlet{" +
                    "id='" + id + '\'' +
                    ", shopname='" + shopname + '\'' +
                    ", shopowner='" + shopowner + '\'' +
                    ", address='" + address + '\'' +
                    ", contact='" + contact + '\'' +
                    ", marketid='" + marketid + '\'' +
                    '}';
        }
        
        }
        

        【讨论】:

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