2013-05-27 3 views
12

Sto provando a sostituire un frammento con un altro utilizzando il nuovo schema del cassetto di navigazione. Sembra funzionare ma quando scelgo un'altra opzione dal cassetto viene caricato il nuovo frammento ma entrambi i frammenti sono visibili. Non sto usando il layout di frammenti statici quindi non so dove sia il problema.Frammento sostituito ancora visibile sullo sfondo

I frammenti vengono caricati tramite il metodo onItemClick che implementa AdapterView.OnItemClickListener sulla mia attività.

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    Fragment fragmentToShow = null; 
    // Load desired fragment 
    switch (position) { 
     case 0: // Authors 
      if (fragmentAuthors == null) fragmentAuthors = new FragmentAuthors(); 
      fragmentToShow = fragmentAuthors; 
      break; 
     case 1: // Books 
      if (fragmentBooks == null) fragmentBooks = new FragmentBooks(); 
      fragmentToShow = fragmentBooks; 
      break; 
    } 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.replace(R.id.ActivityMain_Drawer_FrameMain, fragmentToShow); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    ft.commit(); 
    mDrawerLayout.closeDrawers(); 
} 

layout

<!-- The main content view --> 
<FrameLayout 
    android:id="@+id/ActivityMain_Drawer_FrameMain" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/background_light" /> 

<!-- The navigation drawer --> 
<FrameLayout 
    android:id="@+id/ActivityMain_Drawer_FrameMenu" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/background_light"> 
    <ListView 
     android:id="@+id/ActivityMain_Drawer_FrameMenu_List" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" /> 
</FrameLayout> 

Screenshots

https://dl.dropboxusercontent.com/u/1763308/Screenshots/device-2013-05-27-113128.png https://dl.dropboxusercontent.com/u/1763308/Screenshots/device-2013-05-27-113139.png

risposta

11

Ho lo stesso problema con alcuni frammenti. Per risolverlo colore di sfondo impostato io semplice per tutti i layout frammento, ad esempio:

android:background="?android:attr/colorBackground" 
+12

Hmm Sto avendo lo stesso problema io stesso, ma sicuramente questa risposta è solo mascherare il problema e i frammenti dovrebbero essere fermati piuttosto che avere un riferimento trattenuto e appena nascosto da un colore di sfondo –

+5

Sto supponendo che questo sarà aggiungi un pareggio eccessivo, rendendo la tua animazione ui meno fluida. Questo non risolve il tuo problema ma letteralmente lo nasconde. – MinceMan

+2

Non penso che questa sia una buona soluzione. – rgv

0

tenta di modificare la Android: background = "@ Android: colore/background_light" Colore a qualche altro color.May essere questo risolve il tuo problema.

+0

Ho provato a passare a un colore statico come'android: background = "# F00" 'o usando i riferimenti dei colori di sistema ma il risultato è lo stesso. Entrambi i frammenti vengono visualizzati e non rispondono all'input. – Zetch

+0

Fare riferimento a questa pagina http://developer.android.com/training/implementing-navigation/nav-drawer.html Provare a scaricare il progetto di esempio e confrontarlo con il progetto esistente. Prova a rimuovere ft.setTransition (FragmentTransaction.TRANSIT_FRAGMENT_FADE); questa linea e corri. –

+0

Ok, ho provato a impostare il colore di sfondo su ogni fotogramma e su ogni frammento e sembra funzionare bene. Ma ora ho un altro problema, ogni frammento caricato viene caricato una volta ok ma se li carico nuovamente, ListViews è vuoto. Ogni ListView ha un ArrayAdapter che viene caricato quando viene chiamato 'onActivityCreated' di ogni frammento. – Zetch

1

Ho provato un sacco di risposte suggerite qui su SO e dopo aver impiegato ore ho finalmente potuto risolvere il mio problema senza dover specificare un colore di sfondo sul layout del mio frammento.

La mia soluzione è eseguire l'override del metodo onBackPressed sull'attività tenendo il contenitore di frammento, così ogni volta che si preme il pulsante indietro io rimuovere il frammento mostrato corrente e riportare la precedente:

@Override 
public void onBackPressed() { 
    List<Fragment> fragments = getSupportFragmentManager().getFragments(); 
    if (fragments.size() > 1) { 

     final Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.my_framelayout); 
     if (currentFragment != null) { 
      getSupportFragmentManager().beginTransaction().remove(currentFragment).commit(); 
      getSupportFragmentManager().popBackStack(); 
     } 
    } else { 
     super.onBackPressed(); 
    } 
} 

Speranza questo aiuta.