Ich habe eine, Activity
die eine verwendet Fragment
. Ich möchte einfach ein Objekt von diesem Activity
an das übergeben Fragment
.
Wie könnte ich das machen? In allen Tutorials, die ich bisher gesehen habe, wurden Daten aus Ressourcen abgerufen.
EDIT:
Lassen Sie uns etwas genauer sein:
Meine Aktivität hat einen ListView
auf der linken Seite. Wenn Sie darauf klicken, ist die Idee, ein Fragment
auf den rechten Teil zu laden .
Wenn ich dies Activity
eingebe, wird ein Objekt Category
durch das gegeben Intent
. Dieses Objekt enthält eine Liste anderer Objekte Questions
(die eine Liste von Zeichenfolgen enthält). Diese Questions
Objekte werden in der ListView angezeigt. Wenn ich auf ein Element aus dem klicke ListView
, möchte ich die Liste von String
in Fragment
(in a ListView
) anzeigen .
Dazu rufe ich das setContentView()
von meinem Activity
mit einem Layout auf. In diesem Layout ist die Fragment
mit der richtigen Klasse aufzurufende Klasse definiert . Wenn ich dies aufrufe setContentView()
, wird das onCreateView()
von my Fragment
aufgerufen, aber zu diesem Zeitpunkt gibt das getArguments()
null zurück.
Wie könnte ich es schaffen, es vor dem Anruf von füllen zu lassen onCreateView()
? (Sag mir, wenn ich nicht klar genug bin)
Vielen Dank
fragment.mDescribable = describable;
in newInstance gesetzt? Es funktioniert, aber fehlt mir hier etwas?m
Präfixes. Da die Java-Community das Konzept der Datenkapselung nachdrücklich befürwortet, sollte beachtet werden, dass private Felder nicht außerhalb zugänglich sein müssen. Der Grund dafür, dass es als Parameter von der Singleton-Methode übergeben wird, liegt darin, dass dieses Feld in diesem Kontext obligatorisch ist und somit das potenzielle Risiko verringert, dass Sie vergessen haben, seinen Wert zuzuweisen.Object
dass GeräteSerializable
funktionieren müssen (im Fall das ObjektDescribable
).Sie sollten in Ihrem Fragment eine Methode erstellen, die den Objekttyp akzeptiert, den Sie übergeben möchten. In diesem Fall habe ich es "setObject" genannt (kreativ huh? :)) Diese Methode kann dann jede Aktion ausführen, die Sie mit diesem Objekt benötigen.
MyFragment fragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { fragment = new MyFragment(); getSupportFragmentManager().beginTransaction().add(android.R.id.content, detailsFragment) .commit(); } else { fragment = (MyFragment) getSupportFragmentManager().findFragmentById( android.R.id.content); } fragment.setObject(yourObject); //create a method like this in your class "MyFragment" }
Beachten Sie, dass ich die Support-Bibliothek verwende und Aufrufe von getSupportFragmentManager () nur getFragmentManager () für Sie sind, je nachdem, mit was Sie arbeiten
quelle
setObject
rückt , wird sie nicht unbedingt aufgerufen.In Ihrer Aktivitätsklasse:
public class BasicActivity extends Activity { private ComplexObject co; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_page); co=new ComplexObject(); getIntent().putExtra("complexObject", co); FragmentManager fragmentManager = getFragmentManager(); Fragment1 f1 = new Fragment1(); fragmentManager.beginTransaction() .replace(R.id.frameLayout, f1).commit(); }
Hinweis: Ihr Objekt sollte eine serialisierbare Schnittstelle implementieren
Dann in Ihrem Fragment:
public class Fragment1 extends Fragment { ComplexObject co; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Intent i = getActivity().getIntent(); co = (ComplexObject) i.getSerializableExtra("complexObject"); View view = inflater.inflate(R.layout.test_page, container, false); TextView textView = (TextView) view.findViewById(R.id.DENEME); textView.setText(co.getName()); return view; } }
quelle
Das Übergeben von Argumenten per Bundle ist auf einige Datentypen beschränkt. Sie können jedoch alle Daten folgendermaßen auf Ihr Fragment übertragen:
Erstellen Sie in Ihrem Fragment eine öffentliche Methode wie diese
public void passData(Context context, List<LexItem> list, int pos) { mContext = context; mLexItemList = list; mIndex = pos; }
Rufen Sie in Ihrer Aktivität passData () mit allen erforderlichen Datentypen auf, nachdem Sie das Fragment instanziiert haben
WebViewFragment myFragment = new WebViewFragment(); myFragment.passData(getApplicationContext(), mLexItemList, index); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.my_fragment_container, myFragment); ft.addToBackStack(null); ft.commit();
Anmerkung: Mein Fragment erweitert "android.support.v4.app.Fragment", daher muss ich "getSupportFragmentManager ()" verwenden. Natürlich funktioniert dieses Prinzip auch mit einer Fragmentklasse, die "Fragment" erweitert, aber dann müssen Sie "getFragmentManager ()" verwenden.
quelle
Referenz aus dem folgenden Beispiel abrufen.
1. Im Fragment : Erstellen Sie eine Referenzvariable für die Klasse, deren Objekt Sie im Fragment haben möchten. Erstellen Sie einfach eine Setter-Methode für die Referenzvariable und rufen Sie den Setter auf, bevor Sie das Fragment aus der Aktivität ersetzen.
MyEmployee myEmp; public void setEmployee(MyEmployee myEmp) { this.myEmp = myEmp; }
2. In Aktivität :
//we need to pass object myEmp to fragment myFragment MyEmployee myEmp = new MyEmployee(); MyFragment myFragment = new MyFragment(); myFragment.setEmployee(myEmp); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.main_layout, myFragment); ft.commit();
quelle
Gehen Sie wie folgt vor, um ein Objekt an ein Fragment zu übergeben:
Speichern Sie zuerst die Objekte in Bundle. Vergessen Sie nicht, implementierbare Geräte in die Klasse aufzunehmen.
CategoryRowFragment fragment = new CategoryRowFragment(); // pass arguments to fragment Bundle bundle = new Bundle(); // event list we want to populate bundle.putSerializable("eventsList", eventsList); // the description of the row bundle.putSerializable("categoryRow", categoryRow); fragment.setArguments(bundle);
Rufen Sie dann die Bundles in Fragment ab
// events that will be populated in this row mEventsList = (ArrayList<Event>)getArguments().getSerializable("eventsList"); // description of events to be populated in this row mCategoryRow = (CategoryRow)getArguments().getSerializable("categoryRow");
quelle
Wenn die Daten während des gesamten Anwendungslebenszyklus überleben und von mehreren Fragmenten oder Aktivitäten gemeinsam genutzt werden sollen, wird
Model
möglicherweise eine Klasse in Betracht gezogen, die weniger Serialisierungsaufwand hat.Überprüfen Sie dieses Entwurfsbeispiel
quelle
Dieser hat für mich gearbeitet:
In Aktivität:
User user; public User getUser(){ return this.user;}
In der onCreateView-Methode von Fragment:
Ersetzen Sie das
MainActivity
durch Ihren Aktivitätsnamen.quelle