Wie öffne ich ein neues Fragment aus einem anderen Fragment?
-
21-12-2019 - |
Frage
Ich habe versucht, zwischen Fragmenten zu navigieren.Ich habe die NewFragment.java
mit dem neuen Fragment funktioniert.Mein Problem ist:
Wie mache ich das onClickListener
laufen NewFragment.java
richtig?
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getActivity(), NewFragment.class);
startActivity(i);
}
});
ZU IHRER INFORMATION:Dies ist aus einem Fragment (ich weiß nicht, ob das wichtig ist).
Lösung
Fügen Sie Ihrer Klick-Listener-Funktion folgenden Code hinzu,
NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.Layout_container, nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
Zeichenfolge "findThisFragment"
kann verwendet werden, um das Fragment später zu finden, wenn Sie es brauchen.
Andere Tipps
Dies ist ein genauer beschriebener Code von @ Narendras Code,
Zuerst benötigen Sie eine Instanz des 2. Fragments.Dann sollten Sie Objekte von FragmentManager und FragmentTransaction haben.Der vollständige Code ist wie folgt,
Fragment2 fragment2=new Fragment2();
FragmentManager fragmentManager=getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_main,fragment2,"tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Hoffe, das wird funktionieren.Manchmal erhalten Sie möglicherweise getSupportFragmentManager() anstelle von getFragmentManager() .
Sie sollten eine Funktion innerhalb der Aktivität erstellen, um ein neues Fragment zu öffnen und die Aktivitätsreferenz an das Fragment zu übergeben und bei einem Ereignis innerhalb des Fragments diese Funktion aufzurufen.
@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
super.onListItemClick(l, v, pos, id);
UserResult nextFrag= new UserResult();
this.getFragmentManager().beginTransaction()
.replace(R.id.content_frame, nextFrag, null)
.addToBackStack(null)
.commit();
}
Benutze das,
AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();
Fragment fr = new Fragment_class();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.add(R.id.viewpagerId, fr);
fragmentTransaction.commit();
Nur um genau zu sein, R.id.viewpagerId
wird in Ihrem aktuellen Klassenlayout erstellt, wird das neue Fragment beim Aufruf automatisch infiltriert.
Hinzufügen zur @ Narendra-Lösung...
WICHTIG:Bei der Arbeit mit Fragmenten hängt die Navigation eng mit der Hostaktivität zusammen, sodass Sie nicht einfach von Fragment zu Fragment springen können, ohne diese Fragmentklasse in der Hostaktivität zu implementieren.
Probe:
public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {
Überprüfen Sie außerdem, ob Ihre Host-Aktivität die nächste Überschreibungsfunktion hat:
@Override
public void onFragmentInteraction(Uri uri) {}
Hoffe das hilft...
Nun, mein Problem war, dass ich den Code aus der Antwort verwendet habe, der hier als Lösung überprüft wird, aber nachdem die Ersetzung ausgeführt wurde, war die erste Ebene noch sichtbar und funktionierte unter dem gerade geöffneten Fragment.Meine Lösung war einfach, fügte ich hinzu
.remove(CourseListFragment.this)
das CourseListFragment ist eine Klassendatei für das Fragment, das ich schließen wollte.(Hauptaktivität.java, aber für einen bestimmten Abschnitt (Navigationsschubladenfragment), wenn es für Sie sinnvoller ist) also sieht mein Code jetzt so aus :
LecturesFragment nextFrag= new LecturesFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.remove(CourseListFragment.this)
.replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
Und es wirkt wie ein Zauber für mich.