web-dev-qa-db-fra.com

Actualiser le fragment à la recharge

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?

78
Samantha Withanage

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.

174
Fantômas

Cela actualisera le fragment actuel:

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

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

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

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

3
Ali Nem

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

1
Irshu

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 

0
Emad

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

0
artkoenig

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

}
0
hardiBSalih