11

Sto utilizzando un NSV in un CL per la possibilità di comprimere la barra degli strumenti quando l'NSV scorre verso il basso. Il problema che sto avendo è che il mio NSV non viene fatto scorrere verso l'alto quando viene caricato, ma è piuttosto spostato dalla parte superiore dell'NVV di un margine (non sono sicuro da dove provenga questa spaziatura, non è in lo schema).NestedScrollView (NSV) in CoordinatorLayout (CL): NSV non in cima quando caricato

Si prega di dare un'occhiata alle catture dello schermo, il primo mostra come viene caricato l'NSV e si può vedere chiaramente che l'NSV è sceso un po 'dall'alto confrontando il secondo (quando faccio scorrere l'NSV verso l'alto manualmente):

When NSV loads, it's not at the top NSV scrolled to the top manually for comparison sake

ho fatto alcuni aggiornamenti questa disposizione e causato questo accada, in precedenza, è caricato in alto senza problema. Tuttavia, non ho aggiunto alcuna spaziatura che avrebbe dovuto causare questo.

Ecco il layout che sto utilizzando per questo:

<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/cl_goal_detail" 
    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="0dp" 
    android:layout_weight="1"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/abl_goal_detail" 
     android:layout_width="match_parent" 
     android:layout_height="144dp" 
     app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsing_toolbar_goal_detail" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:paddingBottom="@dimen/content_space_double" 
      app:collapsedTitleTextAppearance="@style/title.dark" 
      app:expandedTitleTextAppearance="@style/display3.plus.dark" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar_goal_detail" 
       style="@style/toolbar" 
       app:layout_collapseMode="pin" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 
     </android.support.design.widget.CollapsingToolbarLayout> 
    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.NestedScrollView 
     android:id="@+id/nsv_goal_detail" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/content_space_half" 
     android:paddingLeft="@dimen/content_space_half" 
     android:paddingRight="@dimen/content_space_half" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <FrameLayout 
      android:id="@+id/container_goal_detail" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="fill_vertical"/> 
    </android.support.v4.widget.NestedScrollView> 
</android.support.design.widget.CoordinatorLayout> 

Tutte le idee sarebbe apprezzato!

risposta

7

OK! Dopo un solido DAY di debug di ogni singolo componente del mio layout e Framment ho identificato quello che ritengo sia un bug.

In primo luogo, il problema: si scopre che la presenza di elementi nella vista secondaria del proprio NSV che modifica la visibilità su View.GONE in fase di runtime sta causando lo scorrimento verso il basso della lista. Ho notato che l'elenco scorre appena sopra l'elemento in cui è stata attivata la visibilità (inclusi eventuali margini impostati sulla vista).

In secondo luogo, la correzione: ho risolto questo problema impostando tutte le visualizzazioni per avere android: visibility = "gone" nel layout xml, quindi, ho attivato la visibilità di ogni vista in base alle esigenze. In precedenza, le visualizzazioni erano visibili per impostazione predefinita e quindi ho lavorato da lì. Avevo solo bisogno di cambiare la mia logica per iniziare con loro TUTTO, non terribilmente difficile.

Suppongo che funzioni perché le viste che si intendono nascondere in fase di esecuzione non fanno parte del calcolo dell'altezza totale quando l'NSV viene creato in onCreateView(). Una volta che il frammento avanza oltre onCreateView(), è possibile modificare le viste in modo dinamico, tuttavia, se le viste vengono calcolate come parte dell'altezza in onCreateView() e THEN nascoste con View.GONE, le misurazioni diventano instabili e si finisce con un elenco scorrere verso il basso in modo significativo.

4

Hai provato aggiungendo sotto la linea della tua viewgroup cioè FrameLayout nel tuo caso

android:descendantFocusability="blocksDescendants" 

Penso che questo funziona anche per voi.

Se non lo si prova, aggiungere in NSV.

+1

Che cosa significava fare in questo caso? –

0

La risposta post mi ha aiutato molto a scoprire il mio problema (btw, era lo stesso). Ma ho capito che funzionava in un modo diverso. Immagino tu stia usando uno RecyclerView. Nel mio caso sto usando 3 RecyclerViews. Bene, dalla tua risposta ho iniziato a nascondere i riciclatori e ho scoperto che solo uno di loro stava causando questo problema. Quello che ho fatto è stato compilato con un postDelayed:

new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       recyler.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
       recyler.setAdapter(new MyAdapter(myList)); 
      } 
     }, 3000); 

Che ha funzionato bene!

+0

Ciao Octavio, non mi consiglia di utilizzare un ritardo per risolvere questo problema. Il ritardo è inutile e a 3 secondi troppo lungo. Le linee guida di Google suggeriscono che una pagina debba renderizzare (senza includere le animazioni) in 16 ms, quindi questo potrebbe frustrare gli utenti. – AutoM8R

1

Nel mio caso, c'era uno EditText vicino al fondo del mio contenuto a scorrimento che stava catturando l'attenzione.Dal momento che fa alcuni strani layout, la vista focalizzata non scorreva verso l'alto quando l'attività è iniziata, quindi la vera causa non era prontamente evidente. Aggiungendo questo al layout del bambino di NestedScrollView ho risolto il problema per me:

android:focusableInTouchMode="true" 
Problemi correlati