2017-02-16 133 views
0

Iam使用內置導航抽屜活動與三個片段菜單,我想通過這些片段進行通信意味着要將數據從一個傳遞到另一個。我發現有三種可能的方式與碎片進行交流。我也清楚地知道片段不會直接通信。在片段之間傳遞對象

  • 使用界面
  • 全球類(擴展應用類)
  • 最後用束

現在我的問題是,這與片段進行溝通的最佳方式,目前蔭使用second method這是我把(getter & setter class)所有這些對象加到Globalized objects which extends Application Class這是正確的方法嗎?

+0

傳遞什麼樣的vlue你需要什麼? –

+0

我需要傳遞一個對象 – Narendhran

+0

序列化您的模型類,並將該對象與putSerializable函數捆綁在一起以使用Fragments傳遞對象。 – nnn

回答

3

你可以在你的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"); 

編輯

序列化你的對象,簡單地實現你的對象類序列化。

如果你的對象類是YourObj.class

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

    // GETTERS AND SETTERS 
} 
+0

謝謝你的回覆,讓我試試你的回答 – Narendhran

+0

謝謝兄弟,這真的解決了我的問題 – Narendhran

+0

我需要一個疑問,我可以使用'Bundle bundle = getArguments(); YourObj obj =(YourObj)bundle.getSerializable(「your_obj」);'第二個片段中的onCreateView方法中的代碼? – Narendhran

3

對象可以片段和活動中通過使模型類序列化或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類,適用於小型對象。 對於Serializable接口訪問這裏: 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"); 
1

數據持有者類別:

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; 
     } 
    } 

FragmentA:

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(); 

FragmentB:

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

在你的活動承載這些片段,定義一個變量,

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 
+0

爲什麼不直接在第二個片段中調用用戶變量? 我實際上做了類似'((HomeActivity)getActivity())。mUser = user'在片段之前&它似乎工作正常。但這真的好嗎?我喜歡它,因爲它很簡單。 – Aba