0

Je crée actuellement une application à l'aide d'une connexion Bluetooth. La connexion est gérée à l'intérieur d'un objet simple (HandleConnection). Lorsque la connexion est établie, mon application passe en mode "distant", ce qui signifie que je remplace mon fragment principal par un autre (RemoteFragment) qui utilise l'objet "HandleConnection".Fragment en cours de réinitialisation après modification de la configuration

Jusqu'à ce que le tout va bien, car à la fin de mon « onCreate » (dans mon activité) Je mets l'attribut handleConnection du RemoteFragment:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_layout); 


    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
    if (savedInstanceState == null) { 
     retainedFragment = new RetainedFragment(); 
     getFragmentManager().beginTransaction().add(retainedFragment, RetainedFragment.class.toString()).commit(); 
     handleConnection = new HandleConnection(this, handler); 
     retainedFragment.setHandleConnection(handleConnection); 

    } else { 

     remoteFragment = (RemoteFragment) getFragmentManager().findFragmentByTag(RemoteFragment.class.toString()); 
     retainedFragment = (RetainedFragment) getFragmentManager().findFragmentByTag(RetainedFragment.class.toString()); 

     if (remoteFragment == null) 
      remoteFragment = new RemoteFragment(); 

     handleConnection = retainedFragment.getHandleConnection(); 
     remoteFragment.setHandleConnection(handleConnection); 
    } 

    fragmentTransaction.commit(); 

} 

Tout fonctionne bien sauf quand je passe en mode paysage. Ensuite (après avoir joué en mode debug), il semble que mon RemoteFragment soit recréé après l'appel de mon setter, ce qui signifie évidemment que mon attribut handleConnection est null. Pourquoi fait-il cela? Je comprendrais si je ne réutilisais pas le fragment précédent (alors j'aurais deux fragments différents l'un sur l'autre) mais dans ce cas ça n'a aucun sens. J'ai fait une solution de contournement en appelant une fonction de rappel dans onCreateView pour obtenir l'objet HandleConnection, mais pourquoi l'attribut serait null lorsque j'ai appelé un setter juste avant?

Merci!

Répondre

0

Donc, apparemment, mon problème est que je n'utilisais pas le droit instance de mon RemoteFragment, ce qui signifie que ma référence actuelle (dans mon activité) avait la valeur non nulle correcte pour mon objet, mais le fragment affiché n'était pas celui-ci (c'était l'ancien qui était recréé et avait donc une valeur nulle pour le handleConnection).

0

A Le cycle de vie d'un fragment est directement affecté par le cycle de vie de l'activité hôte. quand l'activité est détruite, tous les fragments le sont aussi. Pendant les modifications de mise en page, une activité est détruite et recréée.

Dans ce cas, après la rotation, la condition else dans la méthode onCreate() s'exécutera et, par conséquent, le comportement que vous obtenez. Jetez un oeil à la documentation pour une compréhension approfondie.

http://developer.android.com/guide/components/fragments.html

+0

Oui, mais puisque j'appelle '' '' remoteFragment.setHandleConnection (handleConnection); '' '' le remoteFragment ne devrait pas avoir un pointeur nul lors de l'entrée onCreateView? – pLesur

+0

Dans votre condition lorsque vous appelez 'handleConnection = keptFragment.getHandleConnection();' est-ce que ce handle est null? Je suppose que c'est nul. Vous devriez avoir un contrôle de nullité ici avant de le mettre à 'remoteFragment'. – Sabeeh

+0

Non, le handleConnection n'est pas nul. J'ai utilisé le modèle RetainedFragment mentionné dans le doc android ici: [link] (http://developer.android.com/guide/topics/resources/runtime-changes.html) – pLesur

0

Vous devez ajouter à votre inscription d'activité dans AndroidManifes.xml quelque chose comme ça: <activity android:configChanges="orientation|screenSize"/>

Lire l'article this