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.