Hoe open ik een nieuw fragment van een ander fragment?

Ik heb geprobeerd een navigatie tussen fragmenten te maken. Ik heb de NewFragment.javamet het nieuwe fragment werkend. Mijn probleem is:

Hoe zorg ik ervoor dat deze onClickListenerNewFragment.javacorrect uitvoert?

button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(getActivity(), NewFragment.class);
        startActivity(i);
    }
});

Ter info: dit komt uit een fragment (ik weet niet of dat ertoe doet).


Antwoord 1, autoriteit 100%

Voeg de volgende code toe aan uw klikluisterfunctie,

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

De tekenreeks "findThisFragment"kan worden gebruikt om het fragment later te vinden, indien nodig.


Antwoord 2, autoriteit 6%

Dit is een meer beschreven code van de code van @Narendra,

Eerst heb je een instantie van het 2e fragment nodig. Dan zou je objecten van FragmentManager en FragmentTransaction moeten hebben. De volledige code is zoals hieronder,

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

Ik hoop dat dit zal werken. Als je androidxgebruikt, heb je getSupportFragmentManager() nodig in plaats van getFragmentManager().


Antwoord 3, autoriteit 3%

U moet een functie binnen activiteit maken om een ​​nieuw fragment te openen en de activiteitsreferentie aan het fragment doorgeven en bij een gebeurtenis binnen het fragment deze functie aanroepen.


Antwoord 4, autoriteit 2%

Gebruik dit,

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

Antwoord 5

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

Antwoord 6

Als u Kotlin gebruikt om een ​​Fragmentte vervangen door een ander in de container, kunt u

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

Antwoord 7

een eenvoudige optie is om naar het tweede fragment te navigeren door een actie te definiëren in de nav_graph.xmlen deze vervolgens als volgt te gebruiken (voorbeeld voor Kotlin):

rootViewOfFirstFragment.someBtn.setOnClickListener{
            Navigation.findNavController(rootViewOfFirstFragment)
                .navigate(R.id.action_firstFragment_to_secondFragment)
        }

Snippet uitvouwen


Antwoord 8

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

Om precies te zijn, R.id.viewpagerIdwordt aangemaakt in je huidige klaslay-out, bij het aanroepen wordt het nieuwe fragment automatisch geïnfiltreerd.


Antwoord 9

Toevoegen aan @Narendra-oplossing…

BELANGRIJK: Als u met fragmenten werkt, is navigatie nauw verwant aan de activiteit van de host, dus u kunt niet zomaar van fragment naar fragment springen zonder die fragmentklasse in hostactiviteit te implementeren.

Voorbeeld:

public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {

Controleer ook of uw hostactiviteit de volgende overschrijffunctie heeft:


@Override
public void onFragmentInteraction(Uri uri) {}

Ik hoop dat dit helpt…


Antwoord 10

Nou, mijn probleem was dat ik de code uit het antwoord gebruikte, die hier als een oplossing is aangevinkt, maar nadat de vervanging was uitgevoerd, was de eerste laag nog steeds zichtbaar en functioneerde onder het zojuist geopende fragment. Mijn oplossing was eenvoudig, ik heb toegevoegd

.remove(CourseListFragment.this)

het CourseListFragment is een klassenbestand voor het fragment dat ik probeerde te sluiten.
(MainActivity.java, maar voor een specifieke sectie (fragment van de navigatielade), als dit logischer voor u is)
dus mijn code ziet er nu zo uit:

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

En het werkt als een tierelier voor mij.


Antwoord 11

geef allereerst een ID op voor uw fragmentlay-out, bijvoorbeeld:

<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">

en gebruik die ID om de weergave te vervangen door een ander fragment.java-bestand. bijv.

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

Other episodes