6

Ho il seguente layout di pagina principale nella mia app: Strano comportamento del CoordinatorLayout in combinazione con ViewPager

<?xml version="1.0" encoding="utf-8"?> 

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/mainPager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/app_bar_scrolling_view_behavior"> 
    </android.support.v4.view.ViewPager> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     > 

     <android.support.v7.widget.Toolbar 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/actionToolbar" 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent" 
      android:minHeight="?attr/actionBarSize" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      app:title="@string/app_name" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways"> 
     </android.support.v7.widget.Toolbar> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      app:layout_scrollFlags="scroll|enterAlways"> 
     </android.support.design.widget.TabLayout> 
    </android.support.design.widget.AppBarLayout> 
</android.support.design.widget.CoordinatorLayout> 

Il contenuto scorrevole è il ViewPager. Io uso il ViewPager in combinazione con il TabLayout:

ViewPager viewPager = (ViewPager) v.findViewById(R.id.mainPager); 
TabLayout tabLayout = (TabLayout) v.findViewById(R.id.tabLayout); 
tabLayout.setupWithViewPager(viewPager); 
tabLayout.setTabMode(TabLayout.MODE_FIXED); 
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

Tutti i frammenti in adattatore del ViewPager ha un RecyclerView all'interno. Alla prima apertura del contenuto di RecyclerView (in modo che la barra delle applicazioni sia nascosta), quindi passare a un'altra pagina di dati nel ViewPager e scorrere verso il basso i contenuti di RecyclerView, la barra delle applicazioni è ... invisibile. Le principali fasi che conducono a questo problema:

  1. esecuzione su dispositivi con livello di api 11 o superiore (su dispositivi con livello di API inferiore a 11 tutto è ok);
  2. Scorrimento del contenuto verso l'alto;
  3. Passaggio a un'altra pagina di ViewPager;
  4. Scorrimento del contenuto verso il basso per rendere visibile la barra delle applicazioni;
  5. la barra delle applicazioni è invisibile.

Dove è il mio problema? Grazie.

Edit1: l'inizializzazione della barra degli strumenti di Fragment

Toolbar toolbar = (Toolbar) view.findViewById(R.id.actionToolbar); 
toolbar.setTitle(toolbarTitleResId); 
toolbar.inflateMenu(menuResId); 
toolbar.setOnMenuItemClickListener(listener); 

EDIT2: il layout di Fragment

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.Toolbar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/actionToolbar" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:layout_alignParentTop="true" 
     android:minHeight="?attr/actionBarSize" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
     android:background="?attr/colorPrimary"> 
    </android.support.v7.widget.Toolbar> 

    <View 
     android:id="@+id/anchor" 
     android:layout_height="8dp" 
     android:layout_width="match_parent" 
     android:background="@drawable/shadow_gradient_drawable" 
     android:layout_below="@+id/actionToolbar"> 
    </View> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/verticalRecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/anchor"/> 
</RelativeLayout> 
+0

Non vedo nulla che risulti nel codice che hai postato. Puoi aggiungere il codice per l'inizializzazione della barra degli strumenti all'interno del frammento e del file di layout del frammento? – blackcj

+0

Con il codice Fragment aggiunto, tutto funziona ancora correttamente sul mio dispositivo API 22. Consiglierei di dare le barre degli strumenti di ID diversi per evitare conflitti di denominazione ma, anche con lo stesso id, non ero in grado di riprodurre il problema. Se potessi pubblicare più codice qui o mettere il progetto su Github, sarei felice di dare un'altra occhiata. – blackcj

+0

@blackcj, ok, proverò a rendere il mio codice più pulito e se non trovo l'errore lo metto su Github. – vadim

risposta

8

ero in grado di riprodurre questo sul mio API 16 dispositivo (ancora senza problemi su API 22). Questo è sicuramente un bug in AppBarLayout, tuttavia, c'è un rapido intervento. Questo è solo un problema quando AppBarLayout diventa completamente nascosto. Aggiungi una vista con altezza 1dp all'AppBarLayout e tutto dovrebbe funzionare senza essere realmente visibile sulla vista.

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    > 

    <!-- Toolbar and tab bar code --> 
    ... 

    <!-- Add this --> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="@color/colorPrimary" /> 
</android.support.design.widget.AppBarLayout> 
+0

Questa soluzione funziona perfettamente! Grazie per le tue risposte. – vadim

+0

Questo funziona. Grazie. – rjdthegreat

0

Possiamo anche applicare questa soluzione per Passaggio alla pagina di un altro ViewPager

appBarLayout.setExpanded(true, true); 

qui 2 parametro Se è vero che AppBarLayout si espanderà con l'animazione.