Des Fragments de restauration de l'état sur l'orientation changé

J'ai à mettre en œuvre "standart" fragments de navigation dans mon application (voir lien).

Le problème est lorsque l'appareil est en mode portrait, il doit être démontré que 1 fragment, et quand il est tourné en mode paysage, 2 fragments.

J'ai essayé de le faire de 2 façons différentes:

1) je n'utilise que 1 activité avec différents mode portrait et paysage de mises en page.

Portrait de mise en page xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/main_frame_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

Et ici, les paysages de la mise en page:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_left"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_right"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

De l'activité onCreate méthode:

    private static ItemsFragment mItemsFragment;
    private static ItemDetailsFragment mItemDetailsFragment;

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

        if (mItemsFragment == null) {
            mItemsFragment = ItemsFragment.newInstance();
        }
        if (mItemDetailsFragment == null) {
            mItemDetailsFragment = ItemDetailsFragment.newInstance();
        }

        if (isLandscape()) {
            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container_left, mItemsFragment)
                    .commit();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
        } else {
            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container, mItemsFragment)
                    .commit();
        }
    }

Et que la façon dont je l'actualisation de la 2e fragment:

Bundle bundle = new Bundle();
bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, response.getItem());
mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);
if (isLandscape()) {
    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
} else {
    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.main_frame_fragment_container, mItemDetailsFragment).addToBackStack(null).commit();
}

Aussi j'ai sauvegarder et de restaurer les fragments unis, de sorte que mes données ne disparaissent pas après la rotation. En général, ce code fonctionne correctement dans mon cas.

2) j'utilise les 2 activités et la même mise en page pour la 1ère Activité les modes portrait et paysage.

xml mise en page est la même que dans la précédente pour le paysage:

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_left"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_right"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

onCreate méthode (à noter que les morceaux, les entités ne sont pas statiques, comme il l'a été dans le 1er cas):
privé ItemsFragment mItemsFragment;
privé ItemDetailsFragment mItemDetailsFragment;

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

    if (savedInstanceState == null) {
        mItemsFragment = ItemsFragment.newInstance();
        mItemDetailsFragment = ItemDetailsFragment.newInstance();

        getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container_left, mItemsFragment)
        .commit();
        getSupportFragmentManager().beginTransaction()
        .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
    }
}

Et maintenant, si l'appareil est en mode portrait, je commence une nouvelle Activité:

if (isLandscape()) {
    Bundle bundle = new Bundle();
    bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, response.getItem());
    mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);
    getSupportFragmentManager().beginTransaction()
        .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
} else {
    Intent intent = new Intent(getApplicationContext(), DetailsActivity.class);
    intent.putExtra(KEY_ITEM, response.getItem());
    startActivity(intent);
}

Et, enfin, 2ème Activité du onCreate méthode:

protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    setContentView(R.layout.activity_details);

    if (isLandscape()) {
        finish();
    }

    Item item = (Item) getIntent().getExtras().getSerializable(KEY_ITEM);

    Bundle bundle = new Bundle();
    bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, item);

    ItemDetailsFragment mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);

    getSupportFragmentManager().beginTransaction()
        .replace(R.id.main_frame_fragment_container, mItemDetailsFragment).commit();
}

Lorsque l'appareil est tourné en mode paysage, 2ème activité se termine, et je vois ma 1ère activité avec 2 fragments (comme prévu).

Question:

Dans le 1er cas je enregistrer des fragments comme des variables statiques, et de ce fait je ne m'inquiète pas si je change 2e fragment de l'état en mode portrait ou mode paysage (le même fragment est utilisé). Mais je ne pense pas que c'est une bonne idée de l'enregistrer en tant que champs statiques.

Dans le 2ème cas, je ne sais pas comment synchroniser l'Activité d'Un Fragment B (paysage) et de l'Activité Fragment B B (portrait). Si je change quelque chose dans le fragment (je veux dire, le bouton à bascule, etc) et de faire pivoter l'appareil, les modifications doivent être appliquées dans un autre fragment.

En général, ce cas est mieux, et si le 2ème, comment puis-je résoudre les problème de synchronisation? Ou peut-être il y a un autre moyen plus facile. Merci pour la lecture, j'espère que vous pourrez m'aider 🙂

OriginalL'auteur UneXp | 2013-08-08