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.
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();
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.
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();
}
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();
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();
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 :)
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);
}
});
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()
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();
Sie können diesen Code verwenden
((AppCompatActivity) getActivity()).getSupportFragmentManager().replace(R.id.YourFrameLayout, new YourFragment()).commit();