17

EDIT del 2016/01/02: bug dovrebbe essere risolto applicando il codice fornito dal Team Android: https://stackoverflow.com/a/35132144/3397345CoordinatorLayout barra di stato imbottitura scompare dalla ViewPager 2 ° pagina

EDIT del 27/01/2016: Bug ancora non risolto in v23.1.1. Le soluzioni fornite fino ad ora non forniscono una barra di stato trasparente (che è lo scopo di questo layout) o sono troppo complesse. Una nuova schermata record del bug disponibile qui: https://www.youtube.com/watch?v=76IxhlUx8MQ

EDIT del 23/07/2015: Supporto Design Library v22.2.1 non ha riparato :-(Anche questo accade sulla barra degli strumenti di rapido ritorno MainActivity

EDIT del 28/07/2015: domanda Linked:. CoordinatorLayout status bar padding disappears during fragment transactions

da esempio repository https://github.com/chrisbanes/cheesesquare ho implementato il ViewPager sulle attività dettagli funziona, ma la StatusBar scompare dalla seconda pagina, come si vede nella l'immagine solo nei dispositivi Lollipop, qualche idea? Io uso android:fitsSystemWindows="true" ma funziona solo sulla prima pagina :-(

enter image description here

activity_detail_viewpager.xml se metto qui fitsSystemWindows, StatusBar non è più trasparente, ma funziona (barra di stato imbottitura è non perso). Ma vorrei trasparente!

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

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:overScrollMode="ifContentScrolls"/> 

</android.support.design.widget.CoordinatorLayout> 

activity_detail_fragment.xml

<CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/detail_backdrop_height" 
     android:fitsSystemWindows="true" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsing_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed" 
      app:contentScrim="?attr/colorPrimary" 
      app:expandedTitleMarginStart="48dp" 
      app:expandedTitleMarginEnd="64dp"> 

      <ImageView 
       android:id="@+id/back_item" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:scaleType="centerCrop" 
       android:fitsSystemWindows="true" 
       app:layout_collapseMode="parallax" /> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
       app:layout_collapseMode="pin" /> 

     </android.support.design.widget.CollapsingToolbarLayout> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

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

      <android.support.v7.widget.CardView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="@dimen/card_margin"> 

       ... 

      </android.support.v7.widget.CardView> 

      ... 

     </LinearLayout> 

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

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_margin="@dimen/fab_margin" 
     android:clickable="true" 
     android:src="@drawable/ic_discuss" 
     app:layout_anchor="@id/appbar" 
     app:layout_anchorGravity="bottom|end" 
     app:borderWidth="0dp"/> 

</android.support.design.widget.CoordinatorLayout> 

style.xml v21

<resources> 
    <style name="AppTheme" parent="AppTheme.Base"> 
     <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
     <item name="android:statusBarColor">@android:color/transparent</item> 
    </style> 
</resources> 
+1

problema Pubblicato da Google: https://code.google.com/p/android/issues/detail?id=180492 - Edizione è confermata anche da altri ppl – Davidea

risposta

10

Soluzione proposta da Team Android nella risposta del mio difetto segnalato.Questo codice dovrebbe finalmente funzionare.

ViewPager mViewPager; 

ViewCompat.setOnApplyWindowInsetsListener(mViewPager, 
     new OnApplyWindowInsetsListener() { 
    @Override 
    public WindowInsetsCompat onApplyWindowInsets(View v, 
      WindowInsetsCompat insets) { 
     insets = ViewCompat.onApplyWindowInsets(v, insets); 
     if (insets.isConsumed()) { 
      return insets; 
     } 

     boolean consumed = false; 
     for (int i = 0, count = mViewPager.getChildCount(); i < count; i++) { 
      ViewCompat.dispatchApplyWindowInsets(mViewPager.getChildAt(i), insets); 
      if (insets.isConsumed()) { 
       consumed = true; 
      } 
     } 
     return consumed ? insets.consumeSystemWindowInsets() : insets; 
    } 
}); 
+0

Grazie fantastici! – Ale

0

mi sono imbattuto in un problema simile (usando v23.0.1). Nel mio caso, il problema si verifica anche nella prima pagina. Per risolvere il problema, regolare il padding e l'altezza della barra degli strumenti quando viene creato il frammento.

// in onCreateView: adjust toolbar padding 
    Toolbar toolbar = (Toolbar) mRootView.findViewById(R.id.toolbar); 
    toolbar.setPadding(0, getStatusBarHeight(), 0, 0); 
    toolbar.getLayoutParams().height = toolbar.getLayoutParams().height + getStatusBarHeight(); 

    return mRootView; 
} 

public int getStatusBarHeight() { 
    int result = 0; 
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
     result = getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
} 
+0

bello, è un inizio, e qualcosa comincia per funzionare (come una soluzione), ma scorrendo a destra ea sinistra su alcune pagine per avere quel riempimento ora superfluo, c'è un modo per sapere se il riempimento della barra di stato è diventato nuovamente visibile in modo da evitare di aggiungere l'altezza della barra di stato? Dovremmo recuperare l'altezza reale della barra di stato. Suppongo. – Davidea

-1

Sembra la soluzione di questo è semplice

Hai

android:fitsSystemWindows="true" 

Nel frammento CoordinateLayoutView

rimuoverlo da qui e messo in vista root del Activity.

Questo dovrebbe ora tutti i lavori

+0

Ciao, lo scopo è renderlo trasparente, quindi questa soluzione non può essere accettata. Penso che la biblioteca di progettazione funzioni per casi normali e semplici, mentre ha grossi problemi (e non solo questo descritto nella mia domanda) in casi complessi. Sono quasi arrivato ad abbandonare questa libreria in caso di viewpager. – Davidea

+0

per favore mostrami il codice, ho la barra di stato trasparente/colorata se questa è l'immagine su googlecode allora sembra che tu possa avere Android: fitsSystemWindows = "true" in un paio di posti – RuAware

3

Come sidecarcat, mi sono imbattuto in un problema simile (usando v23.1.1). Inserisco qui una soluzione alternativa utilizzando il codice di sidecarcat e aggiungo del codice per rimuovere il riempimento superfluo in alcuni casi.

// in onCreateView: adjust toolbar padding 
    final int initialToolbarHeight = mToolbar.getLayoutParams().height; 
    final int initialStatusBarHeight = getStatusBarHeight(); 
    mToolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int[] locToolbar = new int[2]; 
      mToolbar.getLocationOnScreen(locToolbar); 
      int yToolbar = locToolbar[1]; 
      int topPaddingToolbar = mToolbar.getPaddingTop(); 
      if (isAdded()) { 
       //normal case : system status bar padding on toolbar : yToolbar = initialStatusBarHeight && topPaddingToolbar = 0 
       //abnormal case : no system status bar padding on toolbar -> toolbar behind status bar => add custom padding 
       if (yToolbar != initialStatusBarHeight && topPaddingToolbar == 0) { 
        mToolbar.setPadding(0, initialStatusBarHeight, 0, 0); 
        mToolbar.getLayoutParams().height = initialToolbarHeight + initialStatusBarHeight; 
       } 
       //abnormal case : system status bar padding and custom padding on toolbar -> toolbar with padding too large => remove custom padding 
       else if (yToolbar == initialStatusBarHeight && topPaddingToolbar == initialStatusBarHeight) { 
        mToolbar.setPadding(0, 0, 0, 0); 
        mToolbar.getLayoutParams().height = initialToolbarHeight; 
       } 
      } 
     } 
    }); 

    return mRootView; 
} 

public int getStatusBarHeight() { 
    int result = 0; 
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
     result = getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
} 
Problemi correlati