webentwicklung-frage-antwort-db.com.de

Fragment durch ein anderes Fragment in der Aktivitätsgruppe ersetzen

Ich habe ein Fragment in einer Gruppenaktivität und möchte es durch ein anderes Fragment ersetzen:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

Es funktioniert gut, wenn es als separates Projekt ohne Verwendung einer Aktivitätsgruppe ausgeführt wird. In Log Cat funktioniert alles einwandfrei, da die Steuerung in getview () geht. Es ist jedoch keine Ansicht sichtbar, und es tritt keine Ausnahme auf durch Abschnittsdetailfragment ersetzt werden.

XML des Buchdetailfragments hat die ID book_description_fragment und xml für das Abschnittsbeschreibungsfragment hat die ID section_description_fragment.

Der obige Code befindet sich in der onClick-Methode eines Elements. Wenn der Benutzer auf ein Element in der horizontalen Bildlaufansicht tippt, ändert sich das Fragment.

124
Lion Heart

Fragmente, die in XML hart codiert sind, können nicht ersetzt werden. Wenn Sie ein Fragment durch ein anderes ersetzen müssen, sollten Sie es zuerst dynamisch hinzugefügt haben. 

Hinweis: R.id.fragment_container ist ein Layout oder Container Ihrer Wahl in der Aktivität, in die Sie das Fragment bringen.

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();
236
Subin Sebastian

Bitte sehen Sie diese Frage

Sie können nur ein "dynamisch hinzugefügtes Fragment" ersetzen.

Wenn Sie also ein dynamisches Fragment hinzufügen möchten, siehe this example.

31
Sana

Ich habe eine Gist mit DIE perfekte Methode erstellt, um FragmentErsatz und Lebenszyklus zu verwalten. 

Es ersetzt das aktuelle Fragment nur durch ein neues, wenn es nicht gleich ist und sich nicht im Backstack befindet (in diesem Fall wird es geknackt). 

Es enthält mehrere Optionen, als ob Sie das Fragment im Backstack speichern möchten. 

=> Siehe Gist hier

Wenn Sie diese und eine einzige Aktivität verwenden, können Sie diese zu Ihrer Aktivität hinzufügen:

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}
8
Hugo Gresse

Verwenden Sie den folgenden Code in Android.support.v4

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();
7
Sachin Suthar

Verwenden Sie diesen Code mit v4 

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();
4
Manish Butola

ich hoffe, es geht Ihnen gut. Wenn ich mit Android Fragments anfing zu arbeiten, dann hatte ich auch das gleiche Problem. Dann las ich über 1- Wie wird das Fragment mit anderen umgeschaltet 2- Wie fügt man ein Fragment hinzu, wenn Fragment container nicht hat irgendein Fragment.

nach einigen Forschungs- und Entwicklungsarbeiten habe ich eine Funktion erstellt, die mir in vielen Projekten bis jetzt hilft, und ich verwende diese einfache Funktion immer noch.

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(Android.R.anim.slide_in_left, Android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

genieße deine Codezeit :)

3
John smith

Verwenden Sie ViewPager. Es ist Arbeit für mich.

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});
3
Nikolay

In Kotlin können Sie:

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()
0
Nicola Gallazzi

sie können einfachen Code für die Transaktion verwenden

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 
0
user8427383

Sie können diesen Code verwenden

((AppCompatActivity) getActivity()).getSupportFragmentManager().replace(R.id.YourFrameLayout, new YourFragment()).commit();
0
Diako Hasani