2012-02-20 10 views
6

Questa app è un esercizio di apprendimento per me che utilizza frammenti, tra le altre cose. Ha una singola attività che gestisce alcuni frammenti diversi. Il primo è un ListFragment (A), che mostra quando l'app si avvia e carica gli elementi della lista da un cursore. Facendo clic su una voce dell'elenco si notifica l'attività per sostituire ListFragment con DetailFragment (B) per quell'elemento. Se mentre guardando (B) I ruotare lo schermo, vedo (B) sopra (A), in questo modo:Frammenti Android sovrapposti dopo la rotazione dello schermo

http://postimage.org/image/uhy016ds7/

La mia ipotesi migliore è che ha a che fare con Android distruzione e ri- creando l'attività su una modifica di configurazione. Mi chiedo quale sia la soluzione più pulita per questo problema. Alcuni snippet di codice seguono, fammi sapere se c'è qualcos'altro che dovrei pubblicare.

res/layout/home.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/fragment_place_list" 
     android:name="com.simbiosys.apps.foodfast.ui.PlaceListFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </fragment> 
</FrameLayout> 

MyActivity.onCreate

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    placeListFragment = (PlaceListFragment) getSupportFragmentManager().findFragmentById(
      R.id.fragment_place_list); 

} 

MyActivity.showDetailPane

public void showDetailPane(String id, String reference) { 
    placeDetailFragment = PlaceDetailFragment.newInstance(id, reference); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.addToBackStack(null); 
    ft.hide(placeListFragment); 
    ft.replace(R.id.fragment_container, placeDetailFragment); 
    ft.show(placeDetailFragment); 
    ft.commit(); 
} 
+0

hai esaminato 'risorse alternative'? http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources –

+0

Bene, mi sto concentrando sugli schermi dei telefoni al momento.In ogni caso, il layout per ListFragment non dovrebbe essere diverso nel panorama. In effetti, non esiste un layout xml per ListFragment poiché tutto ciò che ha attualmente è il ListView integrato. – Karakuri

risposta

4

È perché si utilizza un layout di cornice come contenitore. Non si sovrapporrebbe agli altri layout.

E per ciò che si desidera ottenere la migliore pratica è creare un file XML nel proprio layout/cartella in cui viene utilizzato solo il listfragment. Nel proprio layout-land/si inserisce un file XML con entrambi i frammenti utilizzati e disposti.

Quindi il sistema gestisce tutta la creazione del file. frammenti. E la tua attività si riduce sostanzialmente a una chiamata setContentView().

In un elemento dell'elenco fare clic su quindi verificare con il gestore dei frammenti se il proprio frammento di dettaglio è stato creato o meno. Se viene creato si chiama una funzione pubblica all'interno del frammento di dettaglio per impostare i dati.

Se non viene creato, si crea un intent con una nuova attività.

Conosco 2 buoni tutorial: la pagina dei frammenti sulla pagina degli sviluppatori Android e vogella.de entrambi vi forniranno un esempio/tutorial dettagliato.

+0

Grazie per aver sottolineato che era il FrameLayout. Tuttavia, sto provando a non iniziare un'altra attività poiché questo sta facendo un altro lavoro dietro le quinte. Detto questo, mi hai dato una o due idee per aggirare, quindi grazie. – Karakuri

2

Questo funziona per me.

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    .... 
    fragment = getFragmentManager().findFragmentByTag(TAG); 
    if(fragment == null) fragment = new Fragment(); 
    .... 

} 
3

Modificare il FrameLayout per LinerLayout e il problema verrà risolto.

Questo è un problema correlato a FrameLayout.

+1

Questo ha funzionato per me senza dover cambiare la mia architettura. – BeccaP

5

Come per Android dev page, nel metodo onCreate di Activity è necessario verificare se il parametro SavedInstanceState è null prima di aggiungere il frammento all'attività. Lo snippet di codice del metodo onCreate dell'attività da this page afferma che.

// However, if we're being restored from a previous state, 
// then we don't need to do anything and should return or else 
// we could end up with overlapping fragments. 
if (savedInstanceState != null) { 
    return; 
} 
+0

Grazie, funziona perfettamente, mi ha salvato dopo 2 ore di lotta con esso – Mal

+0

semplice e questo ha funzionato. – iCrus

Problemi correlati