25

In Android, come posso evitare che CollapsingToolbar interrompa la compressione se NestedScrollView esaurisce il contenuto per scorrere? Questa funzionalità esiste attualmente nell'app Contatti su Android 5.1.1. Tuttavia, nel mio codice quando NestedScrollView smette di scorrere la barra continua a collassare lasciando uno spazio vuoto tra i due.Interrompi compressione barra strumenti da compressione dopo che NestedScrollView esaurisce il contenuto per scorrere

<?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" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="256dp" 
     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" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed" 
      app:contentScrim="?attr/colorPrimary" 
      app:expandedTitleMarginStart="@dimen/content_padding_normal" 
      app:expandedTitleMarginEnd="64dp"> 
      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:titleTextAppearance="@style/ActionBar.TitleText" 
       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" 
     android:scrollbars="none"> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:paddingBottom="@dimen/keyline_2"> 
      <android.support.v7.widget.CardView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="@dimen/element_spacing_normal"> 
       <include 
        layout="@layout/ViewLoadingIndeterminate" /> 
       <LinearLayout 
        android:id="@+id/progress_status_container" 
        style="@style/ConnectionFieldContainer" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center_vertical" 
        android:orientation="vertical" 
        android:visibility="visible"> 
        <Spinner 
         android:id="@+id/progress_status" 
         android:layout_width="match_parent" 
         style="@style/Text.ConnectionField" /> 
        <TextView 
         style="@style/Text.ConnectionLabel" 
         android:text="@string/mobile.customer.connect.progress.status" /> 
       </LinearLayout> 
      </android.support.v7.widget.CardView> 
      <android.support.v7.widget.CardView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="@dimen/element_spacing_normal"> 
       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="vertical"> 
        <LinearLayout 
         android:id="@+id/email1_container" 
         style="@style/ConnectionFieldContainer" 
         android:orientation="horizontal" 
         tools:visibility="visible"> 
         <LinearLayout 
          android:layout_width="0dp" 
          android:layout_height="wrap_content" 
          android:layout_gravity="center_vertical" 
          android:layout_weight="1" 
          android:orientation="vertical"> 
          <TextView 
           android:id="@+id/email1" 
           style="@style/Text.ConnectionField" 
           tools:text="[email protected]" /> 
          <TextView 
           style="@style/Text.ConnectionLabel" 
           android:text="@string/mobile.customer.connect.email1" /> 
         </LinearLayout> 
         <ImageButton 
          android:id="@+id/action_email1" 
          style="@style/Button.ConnectionAction" 
          android:src="@drawable/ic_email_black_24dp" /> 
        </LinearLayout> 
        <LinearLayout 
         android:id="@+id/email2_container" 
         style="@style/ConnectionFieldContainer" 
         android:orientation="horizontal" 
         tools:visibility="visible"> 
         <LinearLayout 
          android:layout_width="0dp" 
          android:layout_height="wrap_content" 
          android:layout_gravity="center_vertical" 
          android:layout_weight="1" 
          android:orientation="vertical"> 
          <TextView 
           android:id="@+id/email2" 
           style="@style/Text.ConnectionField" 
           tools:text="[email protected]" /> 
          <TextView 
           style="@style/Text.ConnectionLabel" 
           android:text="@string/mobile.customer.connect.email2" /> 
         </LinearLayout> 
         <ImageButton 
          android:id="@+id/action_email2" 
          style="@style/Button.ConnectionAction" 
          android:src="@drawable/ic_email_black_24dp" /> 
        </LinearLayout> 
        <LinearLayout 
         android:id="@+id/phone_day_container" 
         style="@style/ConnectionFieldContainer" 
         android:orientation="horizontal" 
         tools:visibility="visible"> 
         <LinearLayout 
          android:layout_width="0dp" 
          android:layout_height="wrap_content" 
          android:layout_gravity="center_vertical" 
          android:layout_weight="1" 
          android:orientation="vertical"> 
          <TextView 
           android:id="@+id/phone_day" 
           style="@style/Text.ConnectionField" 
           tools:text="801-555-1234" /> 
          <TextView 
           style="@style/Text.ConnectionLabel" 
           android:text="@string/mobile.customer.connect.phone.day" /> 
         </LinearLayout> 
         <ImageButton 
          android:id="@+id/action_call_phone_day" 
          style="@style/Button.ConnectionAction" 
          android:src="@drawable/ic_call_black_24dp" /> 
         <ImageButton 
          android:id="@+id/action_text_phone_day" 
          style="@style/Button.ConnectionAction" 
          android:src="@drawable/ic_textsms_black_24dp" /> 
        </LinearLayout> 
     </LinearLayout> 
    </android.support.v4.widget.NestedScrollView> 
    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/create_reminder" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:layout_anchor="@id/collapsing_toolbar" 
     app:layout_anchorGravity="bottom|right|end" 
     app:borderWidth="0dp" 
     app:elevation="@dimen/shadow_size" 
     android:layout_marginBottom="@dimen/keyline_1" 
     android:layout_marginRight="@dimen/keyline_1" 
     android:src="@drawable/ic_alarm_add_white_24dp" 
     app:backgroundTint="?attr/colorAccent" /> 
</android.support.design.widget.CoordinatorLayout> 

example

+2

uomo, mi piacerebbe conoscere la risposta così ... – Jerry

+0

Qualcuno calcolare questo fuori? – Apoorva

risposta

15

Basta aggiungere

android:layout_gravity="fill_vertical" 

nel vostro NestedScrollView. :)

+0

@chase: questa risposta deve essere contrassegnata corretta. –

+1

Questa risposta non risolve il problema. Fa semplicemente collassare la barra degli strumenti e il contenuto crollando fino in cima, lasciando un vuoto nella parte inferiore dello schermo. Ha un aspetto migliore di una distanza tra la barra degli strumenti e il contenuto, ma in realtà non risolve il problema. – chase

+0

CollapsingToolbar ... È solo una perdita di tempo. Su alcuni dispositivi viene tagliata la GUI. –

1

una soluzione rapida che potrebbe non essere adatta è, nella creazione di attività, misurare l'altezza dello schermo e assegnare al bambino nestedScrollView come minimo unAltezza. Questo non impedirà lo scorrimento di Appbar, ma i tuoi contenuti scorreranno verso l'alto.

//Calculate screen height in pixels 
DisplayMetrics displaymetrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
mScreenHeight = displaymetrics.heightPixels; 

//Get Statusbar size 
int statusBatHeight = 0; 
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
if (resourceId > 0) { 
     mStatusBarHeight = getResources().getDimensionPixelSize(resourceId); 
} 

mContainer = (FrameLayout) findViewById(R.id.fragment_container); 
mContainer.setMinimumHeight(mScreenHeight - mStatusBarHeight); 

Un'altra soluzione (non pratica uno) sarebbe estendere NestedScrollView e sovrascrivere dispatchNestedPreScroll(). Questo metodo è usato per dire a Coordinator Layout che hai una certa quantità di pixel. L'idea è di calcolare se hai già fatto scorrere tutti i pixel e quindi chiamare super.dispatchNestedScrollView() oppure no.

Per calcolare se è già stato visualizzato tutto il contenuto, sono necessarie le dimensioni dello schermo, iterare attraverso i bambini per misurare il contenuto e quanto si è già verificato.

Le cose diventano un po 'più complicate con l'avventura.

1

Aggiungi sotto la linea

android:layout_gravity="fill_vertical" 

al nidificati ScrollView

2

Fai la tua NestedScrollView come

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

Il CollapsingToolbarLayout crollerà e NestedScrollView contenuti funzionerà come avete bisogno.

2

Oggi ho creato un comportamento personalizzato che fa proprio questo.

Estende AppBarLayout.ScrollingViewBehavior, quindi deve essere impostato sulla visualizzazione a scorrimento (NestedScrollView o qualsiasi altra cosa).

Puoi trovarlo on Github, fammi sapere se funziona.

La parte chiave sta impostando in modo programmatico l'altezza compressa di AppBarLayout in base all'altezza del contenuto, in modo tale che, al termine, lo scorrimento si interrompa.

+0

Le risposte di questo e di DPanic284 dovrebbero essere le risposte corrette. Funzionano come un fascino. – Weava

1

Suggerisco di utilizzare natario's solution insieme al codice riportato di seguito per evitare di scrulare l'appBarLayout durante lo scorrimento.

app:scrimVisibleHeightTrigger="?attr/actionBarSize"