Wie öffne ich ein neues Fragment aus einem anderen Fragment?


77

Ich habe versucht, zwischen Fragmenten zu navigieren. Ich habe das NewFragment.javamit dem neuen Fragment zum Laufen gebracht. Mein Problem ist:

Wie kann ich diese machen onClickListenerLauf NewFragment.javarichtig?

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 heraus (ich weiß nicht, ob das wichtig ist).


WICHTIG: Wenn Sie mit Fragmenten arbeiten, hängt die Navigation eng mit der Hostaktivität zusammen. Sie können also nicht einfach von Fragment zu Fragment springen, ohne diese Fragmentklasse in der Hostaktivität zu implementieren. Beispiel: public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener { Überprüfen Sie auch, ob Ihre Host-Aktivität die nächste Überschreibungsfunktion hat: `@Override public void onFragmentInteraction (Uri uri) {}` Hoffe, das hilft ...
Gerry R

Antworten:


144

Fügen Sie folgenden Code in Ihre Click-Listener-Funktion ein:

NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
             .replace(R.id.Layout_container, nextFrag, "findThisFragment")
             .addToBackStack(null)
             .commit();

Die Zeichenfolge "findThisFragment"kann bei Bedarf verwendet werden, um das Fragment später zu finden.


13
Was wird sein Layout_container?
Shailendra Madda

5
kann jemand klären, was Layout_containersein soll?
Huw Davies

8
Layout_container ist die ID des aktuellen Fragments. Ich würde empfehlen, ((ViewGroup) .getView (). GetParent ()). GetId () anstelle von R.id.Layout_container zu verwenden.
BTR Naidu

layout_container ist die ID der Ansicht, die im Aktivitätslayout vorhanden ist, in dem Sie ein Fragment ersetzen möchten
Asad Ali

8
@BTRNaidu Sollte sein: ((ViewGroup) getView (). GetParent ()). GetId ();
KvnH

9

Dies ist mehr 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 lautet 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. Wenn Sie Android X verwenden , benötigen Sie getSupportFragmentManager () anstelle von getFragmentManager ().


und was wäre content_maindas
Huw Davies

1
@HuwDavies den Wert der übergeordneten ID-Ansicht in der Host-Aktivitätslayoutdatei. Beispiel: <FrameLayout android: id = "@ + id / fragment_container" android: layout_width = "match_parent" android: layout_height = "match_parent" />
Eaweb

4

Sie sollten eine Funktion innerhalb der Aktivität erstellen, um ein neues Fragment zu öffnen und die Aktivitätsreferenz an das Fragment zu übergeben. Bei einem Ereignis innerhalb des Fragments sollten Sie diese Funktion aufrufen.


2
Innerhalb eines Fragments haben Sie automatisch bereits einen Verweis auf die übergeordnete Aktivität. Verwenden Sie getActivity () oder wenn Sie onAttach verwenden, befindet sich die Aktivität in den Argumenten.
miva2

3

Benutze das,

AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();

2
@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();  
}

Wo ist content_frame? Ist ein Rahmenlayout?
Luke Cross

2

Sie können Kotlin verwenden, um ein durch ein Fragmentanderes zu ersetzencontainer

button.setOnClickListener {
    activity!!
        .supportFragmentManager
        .beginTransaction()
        .replace(R.id.container, NewFragment.newInstance())
        .commitNow()
}

0
 Fragment fr = new Fragment_class();
             FragmentManager fm = getFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.add(R.id.viewpagerId, fr);
            fragmentTransaction.commit();

R.id.viewpagerIdUm genau zu sein, wird das neue Fragment beim Aufrufen automatisch in Ihr aktuelles Klassenlayout infiltriert.


0

Hinzufügen zur @ Narendra-Lösung ...

WICHTIG: Wenn Sie mit Fragmenten arbeiten, hängt die Navigation eng mit der Hostaktivität zusammen. Sie können also nicht einfach von Fragment zu Fragment springen, ohne diese Fragmentklasse in der Hostaktivität zu implementieren.

Stichprobe:

public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {

Überprüfen Sie außerdem, ob Ihre Hostaktivität über die nächste Überschreibungsfunktion verfügt:

@Override public void onFragmentInteraction(Uri uri) {} Hoffe das hilft...


0

Nun, mein Problem war, dass ich den Code aus der Antwort verwendet habe, der hier als Lösung überprüft wird, aber nachdem der Austausch 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. (MainActivity.java, aber für einen bestimmten Abschnitt (Navigationsschubladenfragment), wenn es für Sie sinnvoller ist), sodass mein Code jetzt so aussieht:

LecturesFragment nextFrag= new LecturesFragment();

                    getActivity().getSupportFragmentManager().beginTransaction()
                            .remove(CourseListFragment.this)
                            .replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
                            .addToBackStack(null)
                            .commit();

Und es funktioniert wie ein Zauber für mich.


0

Geben Sie zunächst eine ID für Ihr Fragment-Layout ein, z.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
**android:id="@+id/cameraFragment"**
tools:context=".CameraFragment">

und verwenden Sie diese ID, um die Ansicht durch eine andere fragment.java-Datei zu ersetzen. z.B

 ivGallary.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          UploadDoc uploadDoc= new UploadDoc();
          (getActivity()).getSupportFragmentManager().beginTransaction()
                  .replace(**R.id.cameraFragment**, uploadDoc, "findThisFragment")
                  .addToBackStack(null)
                  .commit();
      }
  });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.