wake-up-neo.com

Fragment beim Neuladen aktualisieren

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?

78

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.

174
Fantômas

Das aktuelle Fragment wird aktualisiert:

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(this).attach(this).commit();
122
Mbengue Assane

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

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");
    }
}
4

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

3
Ali Nem

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();
    }
2
Sachin Jagtap
   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.

1
Irshu

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 

0
Emad

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

0
artkoenig

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

}
0
hardiBSalih