Los fragmentos restauran el estado en la orientación cambiada

Tengo que implementar la navegación de fragmentos "standart" en mi aplicación (consulteenlazar).

El problema es que cuando el dispositivo está en modo vertical, solo se debe mostrar 1 fragmento, y cuando se gira a modo horizontal, se deben mostrar 2 fragmentos.

Intenté hacer esto 2 maneras diferentes:

1) Uso solo 1 actividad con diferentes diseños de retrato y paisaje.

XML de diseño de retrato:

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

Y aquí el diseño del paisaje:

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

ActividadonCreate método:

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

Y así es como actualizo el 2do fragmento:

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

También guardo y restauro los estados de los fragmentos, por lo que mis datos no desaparecen después de las rotaciones. En general, este código funciona correctamente en mi caso.

2) Uso 2 actividades y el mismo diseño para los modos de retrato y paisaje de 1ra. Actividad.

El diseño xml es el mismo que en el anterior para el paisaje:

    <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étodo (tenga en cuenta que las entidades de los fragmentos no son estáticas, como lo fue en el primer caso): ItemsFragment de elementos privadosFragmento; Artículo privadoDetallesFragmentoItemDetallesFragmento;

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

Y ahora, si el dispositivo está en modo retrato, comienzo una nueva actividad:

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

Y, por fin, 2ª Actividad.onCreate método:

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

Cuando el dispositivo se gira al modo horizontal, la segunda actividad finaliza y veo mi primera actividad con 2 fragmentos (como se esperaba).

Pregunta:

En el primer caso, guardo los fragmentos como variables estáticas, y debido a esto no me importa si cambio el estado del segundo fragmento en modo vertical u horizontal (se usa el mismo fragmento). Pero no creo que sea una buena idea guardarlo como campos estáticos.

En el segundo caso no sé cómo sincronizar la Actividad A Fragmento B (paisaje) y la Actividad B Fragmento B (retrato). Si cambio algo en el fragmento (quiero decir, el botón de alternar, etc.) y gire el dispositivo, los cambios deberían aplicarse en otro fragmento.

En general, ¿qué caso es mejor y, en segundo lugar, cómo puedo resolver el problema de sincronización? O tal vez hay otra forma más fácil. Gracias por leer, espero que me puedas ayudar :)

Respuestas a la pregunta(1)

Su respuesta a la pregunta