7
votes

Fragments et OnconfigurationChangies

J'essaie de faire quelque chose que je fais avec des activités, mais dans un fragment. Ce que je fais, c'est utiliser des activités:

Arrêtez d'abord l'activité redémarre lors de la rotation du périphérique Android: configchange = "KeyboardHÉDITS | Orientation | Screensize" Code> P>

dans mon activité Ajouter: P>

LayoutInflater inflater = inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = inflater.inflate(R.layout.frg.myFragment, null); 

...

LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = inflater.inflate(R.layout.frg.myFragment, null); 

...

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

view = inflater.inflate(R.layout.frg.myFragment, null); 

...

LayoutInflater li = LayoutInflater.from(context);


8 commentaires

Votre question n'est pas claire du tout. Essayez-vous de recréer les fragments après une rotation?


Mon intention est que, après la rotation du périphérique, ne redémarre pas l'activité, mais l'encombréement change du fragment, rechargez la mise en page XML


Vous allez rencontrer des problèmes avec Android: configchange car, pour la plupart, vous ne devriez pas l'utiliser. Il existe de nombreux types de modifications de configuration que vous ne comptez pas. OnsaveDInstancestate Votre ami est votre ami.


J'utilise des bitmaps dans les fragments qui sont automatiquement redimensionnés si les fragments se rechargent chaque fois que vous faites pivoter le périphérique, j'ai le problème de la "mémoire de mémoire". La première charge est contrôlée, mais pas le reste (comment la rotation), donc j'ai besoin de charger une seule fois


Remplacer Android: configchange à cause de bitmaps est une mauvaise excuse. Vous devez persister les bitmaps entre les modifications de configuration via OnsaveDInstanCestate .


@JaySoyer Vous ne pouvez pas persiste des bitmaps dans le paquet. Miguelc: On dirait que vous avez un problème avec trop de bitmaps ou des fuites de mémoire (plus probables). L'utilisation de configchanges dans ce dernier cas est comme être un médecin qui tente de guérir des symptômes et non la cause.


@ Maciejgórski Je n'ai jamais dit qu'il devait utiliser un paquet. Juste que cela doit être persisté. Remarque, le bitmap implémente Parcelable, donc je ne vois aucune raison pour laquelle on ne pouvait pas la mettre dans un paquet avec sa méthode Putparcelable ();


@JaySoyer Oh, ça fait. J'aurais dû vérifier avant de faire un problème;)


5 Réponses :


0
votes

Peut-être que vous pouvez essayer d'utiliser xxx

. Dans tous les cas, le fragment doit encore être détruit et recréé, pourquoi ne pas laisser Android le gérer automatiquement en redémarrant l'activité? S'il y a des données à conserver, vous pouvez l'enregistrer dans OnsaveDInstanCestate () . Réglage Android: configchange = "KeyboardHésdité | Orientation | Screensize" n'est pas recommandé dans Android.


0 commentaires

25
votes

Si je comprends correctement, vous ne voulez pas le fragment pour recharger sur chaque rotation. Au lieu de cela, vous voulez relancer les vues et les mettre à jour avec des informations que vous avez déjà.

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Get a layout inflater (inflater from getActivity() or getSupportActivity() works as well)
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View newView = inflater.inflate(R.layout.frg.myFragment, null);
    // This just inflates the view but doesn't add it to any thing.
    // You need to add it to the root view of the fragment
    ViewGroup rootView = (ViewGroup) getView();
    // Remove all the existing views from the root view.
    // This is also a good place to recycle any resources you won't need anymore
    rootView.removeAllViews();
    rootView.addView(newView);
    // Viola, you have the new view setup
}


7 commentaires

Je pense que c'est une très bonne solution, mais je reçois une force proche et je ne sais pas pourquoi. Je mettais un lien vers les journaux ul.to/arq9y8gj sur les journaux, j'ai également essayé sans utiliser Actionbarcherlock, l'erreur persiste


Vérification du journal des erreurs, il semble que vous ayez une erreur de fragment en double. Vérifiez cette solution Stackoverflow.com/Questtions/14083950/...


Merci travaillé comme un charme


Si vous avez une autre mise en page que supérieure à gauche à votre vue, vous devez définir les paramètres de la mise en page sur la nouvelle vue. Vous pouvez obtenir ceci depuis le précédent bien que: Viewgroup.layoutParams LP = rootview.getchildat (0) .getlayOutparams (); Newview.setlayoutparams (LP);


J'ai essayé: Voir nouvellement gonfler.inflate (r.layout.frg.myfragment, null); Mais a obtenu un avertissement, j'ai donc modifié le code un peu: (1) Je déclare racare rootview d'abord (2) appelez cela à la place "Voir nouvellement vue #fater.inflate (r.layout.my frag, rootview, faux);" Le résultat final fonctionne de la même manière, mais sans l'avertissement. :)


Merci beaucoup, ça a fonctionné comme un charme! Vous pouvez simplement déclarer View finale NewView = vue.inflate (getactivité (), r.layout.frg.myfragment, null); sans avoir une instance de layoutinfater :)


PS: Si vous utilisez Butterknife, n'oubliez pas d'ajouter Butterknife.Inject (Ceci, NewView);



15
votes

Avez-vous envisagé de conserver vos instances de fragment? Voir Fragment # Seretatanstance .

Autoriser votre activité à être recréé (ne spécifiez pas Android: configchange) mais conserver vos instances de fragment à travers les modifications d'orientation. Si toute la levée lourde arrive dans le fragment # surcree, cela devrait fonctionner bien. Oncreate () ne sera plus appelé puisque le fragment n'est pas recréé.


1 commentaires

OnCréateView () est appelé à nouveau pour créer une nouvelle hiérarchie de vue. Il devrait être possible de conserver les bitmaps et de les réutiliser dans les vues nouvellement créées.



2
votes

Je pourrais le faire en réattachant le fragment dans ONCONFIGRATURECHANGED:

   @Override
   public void onConfigurationChanged(Configuration newConfig)
    {
        getActivity().detachFragment(this);

        super.onConfigurationChanged(newConfig);

        ....

        getActivity().attachFragment(this);
    }


1 commentaires

ACTIVITÉ



1
votes

Vous pouvez essayer de DÉTACH FORT> E Joindre STROND> Le fragment:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    FragmentManager fragmentManager = getFragmentManager();
    if (fragmentManager != null) {
        fragmentManager.beginTransaction().detach(this).commitAllowingStateLoss();
    }
    super.onConfigurationChanged(newConfig);
    if (fragmentManager != null) {
        fragmentManager.beginTransaction().attach(this).commitAllowingStateLoss();
    }
}


0 commentaires