10

Ich muss "Standart" Fragmente Navigation in meiner App implementieren (siehe link).Fragmente wiederherstellen Zustand auf Ausrichtung geändert

Das Problem ist, wenn das Gerät im Hochformat ist, sollte nur 1 Fragment angezeigt werden, und wenn es in den Querformatmodus gedreht wird, sollten 2 Fragmente angezeigt werden.

Ich habe versucht, dieses Bild 2 verschiedene Arten zu tun:

1) Ich verwende nur 1-Aktivität mit verschiedenen Hoch- und Quer 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 `s Landschaft 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> 

Activity`s 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 Hier geht So erfrische ich 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(); 
} 

Auch ich speichere und restauriere Fragmente Zustände, so dass meine Daten nicht nach Rotationen verschwinden. Im Allgemeinen funktioniert dieser Code in meinem Fall richtig.

2) Ich verwende 2 Aktivitäten und das gleiche Layout für die ersten Aktivitäten im Hoch- und Querformat.

xml Layout ist das gleiche wie in vorherigen für 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 Entitäten nicht statisch sind, da sie in erster Fall war): privaten 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 das Gerät im Hochformat ist, fange ich 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, 2. Activity`s 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 in den Querformat-Modus gedreht wird, wird die zweite Aktivität beendet und ich sehe meine erste Aktivität mit 2 Fragmenten (wie erwartet).

Frage:

Im ersten Fall I-Fragmente als statische Variablen speichern, und aus diesem Grund ist mir egal, ob ich zweite Fragment Zustand in Hoch- oder Querformat (das gleiche Fragment verwendet wird) ändern. Aber ich denke nicht, dass es eine gute Idee ist, es als statische Felder zu speichern.

Im zweiten Fall weiß ich nicht, wie man Aktivität A Fragment B (Landschaft) und Aktivität B Fragment B (Hochformat) synchronisiert.Wenn ich etwas im Fragment ändere (ich meine, Knopf umschalten usw.) und Gerät rotiere, sollten Änderungen in einem anderen Fragment angewendet werden.

Im Allgemeinen, welcher Fall ist besser, und wenn 2., wie kann ich Synchronisationsproblem lösen? Oder vielleicht gibt es einen anderen einfacheren Weg. Danke fürs Lesen, ich hoffe du kannst mir helfen :)

Antwort

2

Folge einfach diesem Kumpel http://developer.android.com/guide/components/fragments.html. Machen Sie keine Fragmente statisch (das ist nur seltsam)

+0

Danke, das ist was ich brauche. Etwas verwirrte mich gestern in diesem Post, aber ich erinnere mich auch nicht mehr genau. – UneXp

+2

Nicht nur komisch, aber ein Speicherleck. – mwieczorek

+0

seltsame Dinge führen zu seltsamen Abstürzen -> Speicherlecks: 0 –