Conserver l'objet Fragment pendant la rotation

j'ai développé une application dans Honeycomb et j'utilise des fragments.

C'est mon app

  • j'ai une activité (disons A1) et en ce qu'il y a un fragment
  • initialement ce fragment contient l'objet un fragment dit (F1)
  • puis,selon les actions de l'utilisateur, il peut changer en d'autres objets F2, F3 ....

Quel est mon problème?

quand l'utilisateur tourner l'appareil l'activité est recréée et qui font F1 comme objet fragment même si avant de tourner il n'était pas

What is the way to retain the fragment object while rotating?

J'ai utilisé setRetainInstance(true); mais ça n'a pas marché pour moi

Et j'ai ajouté le fragment par code dans ma fonction onCreate comme ceci

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

   FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

   Fragment homeFragment = new Home();
   fragmentTransaction.add(R.id.mainFragement, homeFragment);
   fragmentTransaction.commit();
}
45
demandé sur Willi Mentzel 2011-03-02 09:24:39

5 réponses

par défaut Android conservera les objets fragment. Dans votre code, vous définissez homeFragment dans votre fonction onCreate . C'est pourquoi il est toujours quelque homeFragment ou fl que ce soit que vous avez mis dans onCreate .

parce que chaque fois que vous tournez, l'onCreate exécutera et définira votre objet fragment au premier

donc la solution facile pour vous est de vérifier si savedInstanceState bundle est null ou pas et définir le fragment d'objet

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(null == savedInstanceState) {
        // set you initial fragment object 
    }
 }
59
répondu Labeeb Panampullan 2017-06-01 21:26:23

vous devez donner à votre Fragment une étiquette unique, et vérifier si ce Fragment est déjà ajouté à votre activité ou non.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String tag = "my_fragment";
    FragmentManager fragmentManager = getFragmentManager();
    if(fragmentManager.findFragmentByTag(tag) == null) {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        Fragment homeFragment = new Home();
        fragmentTransaction.add(R.id.mainFragement, homeFragment, tag);
        fragmentTransaction.commit();
    }
}

vérifier si savedInstanceState est nul n'est pas une façon sûre de vérifier si votre fragment est déjà réglé - il fonctionnera dans la plupart des cas, mais dans certains cas (comme lorsque l'appareil est sur la mémoire faible), Android peut tuer votre activité, ce qui pourrait briser votre application.

pour voir cela en action, cochez "Don't keep activities" dans les options de développement de l'appareil (le paramètre est disponible dans Android 4.0+, pas sûr des versions précédentes). Lorsque vous ouvrez une nouvelle activité, de votre première activité est détruite. Quand vous y retournez (en appuyant en arrière), il est créé à nouveau, et savedincestate est pas null. Cependant, votre fragment n'est pas dans l'activité, et de plus, vous devez l'ajouter à nouveau.

EDITION Montrant le principe original mais avec SupportFragmentManager

public class ActivityAwesome extends AppCompatActivity
{
    private final String TAG = getClass().getSimpleName();
    private FragmentHome mHomeFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag(TAG);
        if(fragment == null)
        {
            // Create the detail fragment and add it to the activity using a fragment transaction.
            mHomeFragment = new FragmentHome();
            fragmentManager.beginTransaction()
                    .add(R.id.fragment_container, mHomeFragment, TAG)
                    .commit();
        }
        else
        {
            // get our old fragment back !
            mHomeFragment = (FragmentHome)fragment;
        }
    }
}

cela est particulièrement utile si vous voulez manipuler le fragment (dans ce cas mHomeFragment ) après avoir fait tourner votre appareil

38
répondu Ralf 2016-02-12 19:25:48

utilisez onAttachFragment() dans votre Activity pour réassigner l'objet:

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof MyFragment)
        this.myFragment = (MyFragment) fragment;
}
3
répondu WhereDatApp.com 2017-06-01 21:24:01

j'ai défini un Fragment dans la mise en page de activity, onSaveInstanceState dans le Fragment est appelé, mais le savedInstanceState Bundle dans le Fragment onCreatView est nul.

la raison en était que mon Fragment n'avait pas D'ID en XML:

android:id="@+id/compass_fragment" ...
0
répondu zomarev 2017-06-01 21:25:16

vous pouvez simplement définir la propriété RetainInstance à l'intérieur de OnCreate de la classe fragment.

public override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    RetainInstance = true;
}

conserver le Fragment tout en tournant

0
répondu Shawinder Sekhon 2018-04-26 20:40:30