7

Utilizzo di DrawerLayout con un NavigationView e un FrameLayout Voglio passare a Fragment s. Funziona alla grande. Tuttavia, se posso passare troppo in fretta, poi i Fragment s sovrappone ...Frammenti sovrapposti con DrawerLayout/NavigationView

E 'come executePendingTransactions() non funziona.

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include layout="@layout/toolbar" /> 

     <FrameLayout 
      android:id="@+id/frameLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    </LinearLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigationView" 
     android:layout_width="@240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@color/transparent" 
     android:dividerHeight="0dp" 
     app:menu="@menu/navigationdrawer" /> 

</android.support.v4.widget.DrawerLayout> 

Se posso passare Fragment s (troppo) velocemente (manualmente o con il codice con un ritardo 750ms sul mio Nexus 5), ottengo entrambi Fragment s a sovrapporsi, con la seconda Fragment avere il tocco abilitato MA la prima Fragment stare sopra ...

il primo Fragment contiene un ImageView e TextView s. Il secondo Fragment contiene uno TabLayout e uno ViewPager (se questo potrebbe avere qualsiasi problema con il mio problema). Sì, sto usando le librerie AppCompat 22.2.0 e Design 22.2.0.

Se si imposta un colore di sfondo per entrambi, quindi posso solo vedere il primo Fragment, e non cambia mai.

ho provato popBackStackImmediate(), executePendingTransactions(), remove(fragment), android:fitsSystemWindows="true", Android: fragments overlapping issue, ritardando, e altre cose, ma senza successo.

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // ... 

    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(final MenuItem menuItem) { 
      navigationDrawer(menuItem.getItemId()); 
      return true; 
     } 
    }); 

    if (savedInstanceState == null) { 
     final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
     if (menuItem != null) { 
      navigationDrawer(menuItem.getItemId()); 
     } 
    } 
} 

private void navigationDrawer(final int itemId) { 
    final Fragment fragment = getFragment(itemId); 
    getSupportFragmentManager().beginTrasaction() 
     .replace(R.id.frameLayout, fragment) 
     .addToBackStack(null) 
     .commit(); 
    mNavigationView.getMenu().findItem(itemId).setChecked(true); 
    mDrawerLayout.closeDrawer(mNavigationView); 
    supportInvalidateOptionsMenu(); 
} 

@Override 
public boolean onOptionsItemSelected(final MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu_first: 
     case R.id.menu_second: 
     case R.id.menu_third: 
      navigationDrawer(item.getItemId()); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

EDIT

Nel mio onCreate() stavo facendo questo:

if (savedInstanceState == null) { 
    final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
    if (menuItem != null) { 
     navigationDrawer(menuItem.getItemId()); 
    } 
} 

che si rivela per effettuare una chiamata troppo rapidamente. Rimozione di questo codice risolto il mio problema (temporalmente, vedi sotto).

io ancora non so perché executePendingTransactions() non ha impedito tale emissione strano ...

EDIT 2

ho pensato di tenere un boolean (init a false) per tenere traccia di quando un La transazione Fragment ha luogo. L'ho impostato su true nel mio navigationDrawer() e false in Fragment.onResume(). Ancora non va ...

Quindi: continui ad avere problemi sulla mia MainFragment che carica un'immagine utilizzando Picasso e il passaggio troppo rapidamente (800ms) ad un altro Fragment: ancora si sovrappongono ...

+0

Posso vedere la sua un po 'di codice di ..così che mi può aiutare .. – Moinkhan

+0

@Moinkhan Quale parte di esso? Credo di aver postato la parte relativa. È un'implementazione base di DrawerLayout/NavigationView. – shkschneider

+0

il codice che hai fornito era perfetto. è per questo che ho pensato che il problema potesse essere nel codice, che non è fornito qui ... – Moinkhan

risposta

0

Nel mio onCreate() stavo facendo questo:

if (savedInstanceState == null) { 
     final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
     if (menuItem != null) { 
      navigationDrawer(menuItem.getItemId()); 
     } 
    } 

Che risulta effettuare una chiamata troppo rapidamente. La rimozione di questo codice ha risolto il mio problema.

io ancora non lo so:

perché executePendingTransactions() non ha impedito tale emissione strano ...

EDIT

avendo ancora problema sul mio MainFragment che i carichi un'immagine usando Picasso e passando troppo rapidamente (800 ms) a un'altra: si sovrappongono ancora ...

EDIT 2

Quindi io uso un valore booleano per segnare se il mio Activity sta passando un Fragment o no, con un timer minimo di 1s secondo tra switch.

Nel mio Fragment s onViewCreated():

if (view != null) { 
    view.post(new Runnable() { 
     @Override 
     public void run() { 
      // Activity might be null 
      getActivity().setTransitioning(false); 
     } 
    }); 
} 

E nella mia navigationDrawer():

if (isTransitioning()) { 
    // Switching Fragments too fast 
    return false; 
} 
+0

Un modo alternativo sarebbe quello di verificare se 'Activity' ha passato' onResume() 'all'inizio del mio metodo' navigationDrawer() '. Funziona anche con codice difettoso ora. – shkschneider

+0

E ciò non ha funzionato: ho impostato un 'boolean' per quando una transazione era in atto, e ho reso il mio' Fragment's impostato su false in 'onResume()'. Continua a non funzionare... – shkschneider

1

Si può provare questo. .. sarà ritardare la vostra frequente click ...

private final Handler mDrawerActionHandler = new Handler(); 
private static final long DRAWER_CLOSE_DELAY_MS = 250; 

mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     // your navigation code goes here 
     } 
}, DRAWER_CLOSE_DELAY_MS); 
+0

Pensato e fatto già: non ha funzionato (in più non spiega il mio problema). Grazie per l'input in ogni caso – shkschneider