Dans une application Android
, je charge des données d'une Db
dans une TableView
dans une Fragment
. Mais quand je Reload
le fragment
il affiche les données précédentes. Puis-je repeupler la Fragment
avec les données actuelles au lieu des données précédentes?
Je pense que vous voulez actualiser le contenu du fragment lors de la mise à jour de la base de données
Si oui, détachez le fragment et rattachez-le
// 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 est le nom que vous avez donné à votre fragment lors de sa création.
Ce code est pour la bibliothèque de support.
Si vous ne supportez pas les appareils plus anciens, utilisez simplement getFragmentManager au lieu de getSupportFragmentManager
[MODIFIER]
Cette méthode nécessite que le fragment ait une étiquette.
Au cas où vous ne l'auriez pas, la méthode de @ Hammer est ce qu'il vous faut.
Cela actualisera le fragment actuel:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(this).attach(this).commit();
Si vous n'avez pas la balise fragment, le code suivant me convient bien.
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();}
}
vous pouvez actualiser votre fragment quand il est visible par l'utilisateur, Il suffit d'ajouter ce code dans votre fragment pour actualiser votre fragment lorsqu'il sera visible.
@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");
}
}
Vous ne pouvez pas recharger le fragment lorsqu'il est attaché à une activité, où vous obtenez une exception "Fragment Already Added
".
Donc, le fragment doit d'abord être détaché de son activité puis attaché. Tout peut être fait en utilisant l’API fluide sur une seule ligne:
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Update: Il s’agit d’incorporer les modifications apportées à l’API 26 et aux versions ultérieures:
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
Pour plus de détails sur la mise à jour, veuillez consulter https://stackoverflow.com/a/51327440/4514796
Pour actualiser le fragment, toutes les réponses ci-dessus ne fonctionneront pas sur Oreo et la version précédente. Pour que cela fonctionne sur tous les systèmes d'exploitation, vous pouvez suivre.
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();
cela ne fonctionnera que si vous utilisez FragmentManager
pour initialiser le fragment. Si vous l'avez en tant que <fragment ... />
en XML, il n'appellera plus la onCreateView
. J'ai gaspillé mes 30 minutes pour comprendre cela.
J'ai eu le même problème, mais rien de ce qui précède n'a fonctionné pour le mien. soit il y avait un problème de pile (après le chargement lorsque l'utilisateur appuyait sur le bouton pour revenir au même fragment), soit il n'appelait pas le onCreaetView
enfin j'ai fait ça:
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();
}
le bon point est que vous n’avez pas besoin de la balise ou de l’identifiant du fragment non plus . si vous voulez recharger
Utilisez un ContentProvider
et chargez vos données en utilisant un 'CursorLoader'. Avec cette architecture, vos données seront automatiquement rechargées lors des modifications de la base de données. Utilisez les frameworks tiers pour votre ContentProvider
- vous ne voulez pas vraiment l'implémenter vous-même ...
Voici ce que j’ai fait et cela a fonctionné pour moi j’utilise firebase et lorsque l’utilisateur se connecte, je voulais actualiser le fragment actuel tout d’abord. est le code que j'ai utilisé et travaillé dans la langue kotlin, je pense que vous pouvez utiliser la même chose en classe Java
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()
}
}
}