2014-08-31 9 views
10

Sto costruendo un cassetto di navigazione come progettato dalla documentazione di google, tuttavia ho un problema in cui il frammento non viene sostituito. http://developer.android.com/training/implementing-navigation/nav-drawer.htmlFrammento Transazione carica vista vuota ma il frammento viene mostrato dopo il dispositivo rotante

Quando l'app viene caricata per la prima volta, viene caricato il frammento predefinito. Fare clic su un altro elemento nell'elenco dei cassetti lascia una vista vuota Tuttavia, durante la rotazione del dispositivo, carica il frammento scelto.

public void selectNavActivty(int position){ 
    // TODO Changing between the different screens selection 
    fragment = null; 
    switch (position) { 
     case 0: 
      fragment = OverLay.newInstance(); 
      break; 
     case 1: 
      fragment = Dummy.newInstance(); 
      break; 
     } 

    if(fragment != null) { 
     // attach added to handle viewpager fragments 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.content_frame, fragment).attach(fragment) 
      .addToBackStack(null); 

     trans.commit(); 
     getFragmentManager().executePendingTransactions(); 
    } else { 
     Log.d("Drawer Activity","Error in creating Fragment"); 
    } 
} 
+1

Ho il problema SAME. Non è comune Succede 1 su 20 tentativi. onActivityCreated viene creato, la vista può essere vuota OPPURE parte della vista può essere vuota ... Aggiungo invece di sostituire. – apmartin1991

+0

@ apmartin1991 puoi fornire i tuoi frammenti di codice da qualche parte qui (come gist.github.com, ad esempio) - sarebbe più facile capire la causa principale? (nel post originale, ad esempio, viene chiamato .attach(), ma non dovrebbe e non c'è bisogno di chiamare 'executePendingTransactions()', ad esempio, ma non sappiamo nulla del tuo problema. –

+0

Konstantin Loginov - Ecco la mia domanda sulla stessa cosa http://stackoverflow.com/questions/34742360/fragment-transaction-loads-a-blank-view – apmartin1991

risposta

5

Per le operazioni di frammenti di menu di navigazione che uso il seguente approccio, in questo modo saranno aggiunti il ​​frammento e posto sulla parte superiore.

String name = "myFragment"; 
getSupportFragmentManager() 
.beginTransaction() 
.replace(R.id.content_frame, fragment, name) 
.commit(); 

Cercare la funzione attach(). Segue un diverso ciclo di vita dei frammenti. Assicurati anche che il framelayout dei file di layout sia visibile.

0

modificare il codice, come di seguito:

if(fragment != null) { 
     // attach added to handle viewpager fragments 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.content_frame, fragment); 
     trans.addToBackStack(null); 
     trans.commit(); 
    } else { 
     Log.d("Drawer Activity","Error in creating Fragment"); 
    } 

Se la soluzione non funziona per voi, condividere il codice XML con il vostro frammento di codice.

+1

Non è solo la copia-incolla della risposta di @Veedka? –

0

Dopo aver aggiunto Fragment verrà aggiunto allo stato di attività e la sua vista verrà aggiunta alla vista Contenitore definita. Ma allegando nulla verrà visualizzato se il frammento non è stato già aggiunto all'interfaccia utente. Allega semplicemente al gestore dei frammenti. Tuttavia, se la vista è già stata aggiunta a un contenitore nell'interfaccia utente e scollegata, dopo averla allegata verrà visualizzato nuovamente nel suo contenitore. Infine puoi usare attach e stacca se vuoi distruggere frammento View temporaneamente e vuoi visualizzare e costruire la sua vista sul futuro senza perdere il suo stato all'interno dell'attività.

https://stackoverflow.com/a/18979024/3329488

0

La mia soluzione è quella di etichettare tutto il frammento con tag unico sulla sostituzione frammento. Assicurarsi di assegnare anche un tag univoco al frammento predefinito durante la creazione. Un modo più efficiente è identificare il frammento prima di ricreare lo stesso.

public void selectNavActivty(int position){ 
// TODO Changing between the different screens selection 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragment = fragmentManager.findFragmentById(R.id.content_frame); 
    String fragmentTag = null; 
    switch (position) { 
     case 0: 
      fragmentTag = "case0Tag"; // please change to better tag name 
      break; 
     case 1: 
      fragmentTag = "case1Tag"; // please change to better tag name 
      break; 
     default: 
      Log.d("Drawer Activity","Error in creating Fragment"); 
      return; 
    } 
    if (fragmentTag != null && !fragment.getTag().equals(fragmentTag)) 
    fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit(); 
} 
Problemi correlati