Fragmente Zustand wiederherstellen auf die Ausrichtung geändert

Habe ich zur Umsetzung der "standart" Fragmente-navigation in meiner app (siehe link).

Das Problem ist, wenn das Gerät im portrait-Modus, es sollte nur gezeigt, 1 fragment, und beim drehen in das Querformat, 2-Fragmente gezeigt werden sollte.

Habe ich versucht, das zu tun dieses 2 verschiedene Möglichkeiten:

1) ich benutze nur 1-Aktivität mit verschiedenen hoch-und Querformat-layouts.

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

Und hier ist der Querformat-layout:

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

Aktivität onCreate Methode:

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

- Und das ist der Weg, den ich aktualisieren 2. 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();
}

Ich auch speichern und wiederherstellen Fragmente` Staaten, so dass meine Daten verschwinden nicht nach Rotationen. Im Allgemeinen wird dieser code funktioniert in meinem Fall.

2) ich benutze 2 Aktivitäten und das gleiche layout für die 1. Aktivität im hoch-und Querformat.

xml-layout ist die gleiche wie im Vorjahr ein für die Landschaft:

    <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 - Methode (beachten Sie, dass Fragmente, die Personen sind nicht statisch, wie es war im 1. Fall):
private ItemsFragment mItemsFragment;
private 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();
    }
}

Und jetzt, wenn sich das Gerät im portrait-Modus ich starten Sie eine neue Aktivität:

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

Und, endlich, die 2. Aktivität onCreate Methode:

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

Wenn das Gerät gedreht wird, um landscape-Modus, 2. Aktivität beendet, und ich sehe meine 1. Aktivität mit 2-Fragmente (wie erwartet).

Frage:

In der 1. Fall, den ich speichern Fragmente als statische Variablen, und deshalb ist es mir egal, ob ich das ändern 2. fragment Zustand, in hoch-oder Querformat (das gleiche fragment verwendet wird). Aber ich glaube nicht, dass es eine gute Idee, speichern Sie es als statische Felder.

Im 2. Fall weiß ich nicht, wie sync-Aktivität, die Ein Fragment B (Landschaft) und Aktivität B Fragment B (Porträt). Wenn ich etwas ändern in fragments (ich meine, toggle-Buttons etc) und drehen Gerät, änderungen angewendet werden sollte, in einem anderen fragment.

In der Regel, in welchem Fall besser ist, und wenn 2., wie kann ich das beheben Synchronisierung Problem? Oder vielleicht gibt es eine andere einfachere Möglichkeit. Vielen Dank für das Lesen, ich hoffe Ihr könnt mir helfen 🙂

InformationsquelleAutor UneXp | 2013-08-08

Schreibe einen Kommentar