Domanda

Questa app è un esercizio di apprendimento per me usando frammenti, tra le altre cose. Ha un'unica attività che gestisce alcuni frammenti diversi. Il primo è un listfragment (a), che mostra quando l'app inizia e carica elementi elencati da un cursore. Facendo clic su un elenco elemento notifica l'attività per sostituire ListFragment con un dettaglio (b) per quell'elemento. Se mentre guardo (b) ruoto lo schermo, vedo (b) in cima a (a), in questo modo:

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

La mia ipotesi migliore è che abbia a che fare con Android che distrugge e ricreare l'attività su una modifica della configurazione. Mi chiedo qual è la soluzione più pulita per questo problema. Seguono alcuni frammenti di codice, 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();
}
È stato utile?

Soluzione

È perché usi un layout del frame come contenitore. Non sarebbe sovrapposto per altri layout.

E per quello che vuoi ottenere le migliori pratiche è creare un file XML nel layout/ cartella in cui viene utilizzato solo il tuo listfragment. Nel tuo layout-terra/ hai messo un file XML con frammenti utilizzati e disposti.

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

In un elemento dell'elenco Fare clic su Tieni, quindi verificare con Framment Manager se il tuo frammento di dettaglio è stato creato o meno. Se viene creato la tua chiamata una funzione pubblica all'interno del frammento di dettaglio per impostare i dati.

Se non è stato creato, si crea un intento con una nuova attività.

Conosco 2 buoni tutorial: la pagina dei frammenti sulla pagina degli sviluppatori Android e Vogella.de ti darà entrambi un esempio/tutorial dettagliato.

Altri suggerimenti

Secondo Android Dev pagina, nel metodo OnCreate di Activity, è necessario verificare se il SavedInstancestate è nullo prima di aggiungere il frammento all'attività. Codice snippet del metodo di attività OnCrea da questa pagina 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;
}

Cambia il framelayout per LinerLayout e il problema sarà risolto.

Questo è un problema correlato al framelayout.

Questo funziona per me.

public void onCreate(Bundle savedInstanceState) {

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top