android scroll android-support-library android-7.0-nougat nestedscrollview

android - NestedScrollView arroja error de detención en Nougat(API 25)



android-support-library android-7.0-nougat (2)

Entonces, claramente es un error en NestedScrollView. He hecho una solución para esto, pero aún estoy esperando una solución adecuada del lado de Google.

https://github.com/Dimezis/FlingableNestedScrollView/

Editar :

Parece que el problema está solucionado en support lib 26.0.0-beta2

https://chris.banes.me/2017/06/09/carry-on-scrolling/

Editar 2 : aunque el desplazamiento funciona bien ahora, en mi aplicación puedo reproducir este error constantemente:

https://issuetracker.google.com/issues/37051723

Si alguien lo encuentra también, puede encontrar una solución en un hilo mencionado.

Tengo un problema extraño con NestedScrollView fling en Nexus 5x (7.1.2) y Google Pixel (7.1.1). En otras versiones del sistema operativo, funciona bien.

La animación de Fling a veces se detiene justo después de levantar un dedo. Es difícil y los próximos aventuras pueden detenerse también. Para poder reproducirlo, debes lanzar varias veces hacia arriba y hacia abajo.

En los registros, estos lanzamientos se parecen mucho en términos de velocidad, dirección, etc., así que no puedo encontrar una causa real de este error.

Además, NestedScrollView no necesariamente debe estar dentro de CoordinatorLayout , sino que tampoco puede tener NestedScrollingChild .

Por ejemplo, este error es reproducible con uno de los siguientes hijos NestedScrollView :

1) LinearLayout poblado con TextViews

2) WebView

3) LinearLayout poblado con RecyclerViews .

Conozco posibles problemas con RecyclerView y Behaviors dentro de CoordinatorLayout , pero no está relacionado. Así que por favor no menciones ningún

recyclerView.getLayoutManager().setAutoMeasureEnabled(true); recyclerView.setNestedScrollingEnabled(false);

o cosas por el estilo

Muestra de código:

<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:text="Put a super long text here"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:text="Put a super long text here"/> </LinearLayout> </android.support.v4.widget.NestedScrollView>


de acuerdo con Animar una guía de entrenamiento de Gesto de desplazamiento , al anular computeScroll (), después de usar mScroller.computeScrollOffset () para calcular la compensación adecuada para la vista de desplazamiento, necesitamos usar:

ViewCompat.postInvalidateOnAnimation(this);

para animar el siguiente pergamino. Sin embargo, en el NestedScrollView, computeScroll () se ve así:

public void computeScroll() { if (mScroller.computeScrollOffset()) { ... } }

¡No solicita la próxima animación de desplazamiento! Lo que significa que después de usar mScroller.fling (...), el método computeScroll () a veces solo se llamará una vez, y la vista no mantiene fling.

Para solucionar este problema, he intentado reemplazar el cálculo de desplazamiento de esta manera:

public void computeScroll(){ if(mScroller.computeScrollOffset()){ ... ViewCompat.postInvalidateOnAnimation(this); } }

Puede que no suene como una buena solución, pero funciona bien por ahora.