In einer Android
-Anwendung lade ich Daten von einem Db
in ein TableView
innerhalb eines Fragment
. Wenn ich Reload
die fragment
, dann werden die vorherigen Daten angezeigt. Kann ich das Fragment
mit aktuellen Daten anstelle von vorherigen Daten erneut auffüllen?
Ich denke, Sie möchten den Fragment-Inhalt nach DB-Aktualisierung aktualisieren
Wenn ja, lösen Sie das Fragment und befestigen Sie es erneut
// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
Your_Fragment_TAG ist der Name, den Sie Ihrem Fragment bei der Erstellung gegeben haben
Dieser Code dient zur Unterstützung der Bibliothek.
Wenn Sie ältere Geräte nicht unterstützen, verwenden Sie einfach getFragmentManager anstelle von getSupportFragmentManager
[BEARBEITEN]
Diese Methode erfordert, dass das Fragment ein Tag hat.
Wenn Sie es nicht haben, ist die Methode von @ Hammer genau das, was Sie brauchen.
Das aktuelle Fragment wird aktualisiert:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(this).attach(this).commit();
Falls Sie das Fragment-Tag nicht haben, funktioniert der folgende Code gut für mich.
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();}
}
sie können Ihr Fragment aktualisieren, wenn es für den Benutzer sichtbar ist, Fügen Sie diesen Code einfach in Ihr Fragment ein.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh your fragment here
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Log.i("IsRefresh", "Yes");
}
}
Sie können das Fragment nicht erneut laden, wenn es an eine Aktivität angehängt ist, wo Sie die Ausnahme "Fragment Already Added
" erhalten.
Das Fragment muss also zunächst von seiner Aktivität gelöst und dann angefügt werden. Alles kann mit der fließenden API in einer Zeile gemacht werden:
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Update: Dies beinhaltet die Änderungen, die an API 26 und höher vorgenommen wurden:
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
Weitere Informationen zum Update finden Sie unter https://stackoverflow.com/a/51327440/4514796
Zum Aktualisieren des Fragments funktionieren alle obigen Antworten nicht für Oreo und die Version über. Damit es auf allen Betriebssystemen funktioniert, können Sie Folgendes tun.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fragmentManager.beginTransaction().detach(this).commitNow();
fragmentManager.beginTransaction().attach(this).commitNow();
} else {
fragmentManager.beginTransaction().detach(this).attach(this).commit();
}
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
dies funktioniert nur, wenn Sie FragmentManager
verwenden, um das Fragment zu initialisieren. Wenn Sie es als <fragment ... />
in XML haben, wird die onCreateView
nicht mehr aufgerufen. Ich habe meine 30 Minuten verschwendet, um das herauszufinden.
Ich hatte das gleiche Problem, aber bei mir funktionierte nichts. Entweder gab es ein Backstack-Problem (nach dem Laden, wenn der Benutzer zurückgedrückt wurde, würde das gleiche Fragment erneut ausgeführt werden) oder die Variable onCreaetView
wurde nicht aufgerufen.
endlich habe ich das gemacht:
public void transactFragment(Fragment fragment, boolean reload) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (reload) {
getSupportFragmentManager().popBackStack();
}
transaction.replace(R.id.main_activity_frame_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
ein guter Punkt ist, dass Sie weder das Tag noch die ID des Fragments benötigen, wenn Sie es erneut laden möchten
Verwenden Sie eine ContentProvider
und laden Sie Ihre Daten mit einem 'CursorLoader'. Bei dieser Architektur werden Ihre Daten bei Datenbankänderungen automatisch neu geladen. Verwenden Sie fremde Frameworks für Ihre ContentProvider
- Sie möchten sie nicht wirklich selbst implementieren ...
Was ich getan habe und es hat für mich funktioniert, benutze ich Firebase und wenn der Benutzer logIn ist, wollte ich zunächst das aktuelle Fragment auffrischen. Dazu müssen Sie den Kontext aus der Aktivität herausholen ist der Code, den ich in der Kotlin-Sprache verwendet und gearbeitet habe. Ich denke, Sie könnten das gleiche in der Java-Klasse verwenden
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
val context = requireActivity()
if (auth.currentUser != null) {
if (isVisibleToUser){
context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
}
}
}