2017-02-16 2 views
0

Ich verwende integrierte Navigationsschubladenaktivität mit drei Fragmentmenüs. Ich möchte über diese Fragmente kommunizieren bedeutet, dass Daten von einem zum anderen übertragen werden sollen. Und ich fand, dass es drei Möglichkeiten gibt, mit Fragmenten zu kommunizieren. Auch ich hatte klar verstanden, dass das Fragment niemals direkt kommuniziert.Übergeben von Objekten zwischen Fragmenten

  • Schnittstelle Mit
  • Globaler Klasse (erweitert Anwendungsklasse)
  • schließlich Mit Bündel

Und nun meine Frage ist, welche ist die beste Art und Weise mit Fragmenten zu kommunizieren ist, zur Zeit Iam mit second method was ich gesetzt habe (Getter & Setter-Klasse) all diese Objekte auf die Globalized objects which extends Application Class. Ist das der richtige Ansatz oder nicht?

+0

, was überprüfen Art auf vlue Sie übergeben müssen? –

+0

Ich muss ein Objekt übergeben – Narendhran

+0

serialisieren Sie Ihre Modellklasse und legen Sie das Objekt im Paket mit putSerializable-Funktion, um Objekte mit Fragmenten übergeben. – nnn

Antwort

3

Sie können Serializable in Ihrer Object-Klasse implementieren und dann einfach unter Verwendung von Bundles übergeben. Ich gehe davon aus, dass Sie das second_fragment von Ihrem first_fragment starten.

In Ihrem ersten 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(); 

In Fragment zwei:

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

EDIT

Um Ihr Objekt zu serialisiert, einfach implementieren Serializable in Ihrer Objektklasse .

Wenn Ihre Objektklasse ist YourObj.class

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

    // GETTERS AND SETTERS 
} 
+0

Vielen Dank für Ihre freundliche Antwort, lassen Sie mich versuchen Sie Ihre Antwort – Narendhran

+0

Danke Bruder, das ist wirklich mein Problem lösen – Narendhran

+0

Ich brauche einen Zweifel, kann ich 'Bundle Bundle = getArguments(); YourObj obj = (YourObj) bundle.getSerializable ("your_obj"); 'der Code in der Methode onCreateView im zweiten Fragment ?? – Narendhran

3

Objekte unter Fragment übergeben werden können und Aktivitäten, indem sie die Modellklasse Serializable oder Parcel.

Parcelable ist eine Android-Klasse und kann komplexere Serialisierung von Klassen unterstützen. Überprüfen Sie die Implementierung der Parceble-Klasse hier: http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

Serializable ist eine Java-Klasse und eignet sich gut für kleine Objekte. Für Serializable Besuch hier: https://developer.android.com/reference/java/io/Serializable.html

Ihre Modellklasse Angenommen NewObject in Ihrem Fragmente Klasse folgenden dann verwenden:

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

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

Um es aus Bündel in einer anderen Fragmente Verwendung in Ihrer onCreate Funktion zu erhalten:

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

Data Holder Klasse:

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

in Ihrer Tätigkeit die Fragmente Hosting, definieren Sie eine Variable,

public class HomeActivity{ 

    public User mUser; 
    ... 
} 

Nun, in Ihrem Fragment, wenn Sie Antwort erhalten aus Ihre Api, initialisieren Variable User in Aktivität wie folgt:

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

}

Angenommen, Ihre User Klasse implementiert Parcel Schnittstelle, und wenn nicht, dann machen nur die Klasse Parcel. Dies funktioniert genauso wie Serializable in Java, aber Parcelable ist optimiert für Android.

Schließlich, wenn Sie zweites Fragment laden, einfach Benutzerobjekt zweites Fragment wie unten passieren:

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

Warum nicht einfach die Benutzervariable im zweiten Fragment auf die gleiche Weise wie es im zweiten Fragment initialisiert wurde? Ich habe tatsächlich etwas wie '((HomeActivity) getActivity()). MUser = Benutzer 'in Fragmenten vor und es scheint gut zu funktionieren. Aber ist das wirklich in Ordnung? Ich mag es, weil es einfach ist. – Aba

Verwandte Themen