Método onClick no funciona correctamente después de que NestedScrollView desplazado

Utilicé NestedScrollView con CoordinatorLayout para activar la animación de desplazamiento para la barra de herramientas (por app: layout_scrollFlags = "scroll | enterAlways").

NestedScrollView contiene el LinearLayout como el hijo raíz, pongo los 2 TextViews en LinearLayout para activar la animación de expand / collapse. El uno fue puesto Visible y otro fue puesto a Gone. Y cambio de visibilidad por evento onClick de LinearLayout

Normalmente, todo funciona como se esperaba, pero cuando hice clic en el NestedScrollView, el evento onClick no funcionaba correctamente. Necesito hacer doble clic después de desplazarse para obtener la animación de expandir / contraer

¿Alguien tiene el mismo problema conmigo? por favor, ayúdame

<android.support.design.widget.CoordinatorLayout 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="match_parent"> <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:paddingBottom="98dp" android:paddingLeft="24dp" android:paddingRight="24dp"> <android.support.v7.widget.AppCompatTextView android:id="@+id/detail_expense_reason_trim" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="false" android:textColor="@color/add_new_expense_text_color" /> <android.support.v7.widget.AppCompatTextView android:id="@+id/detail_expense_reason" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="false" android:textColor="@color/add_new_expense_text_color" android:visibility="gone" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/detail_expense_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> </android.support.design.widget.AppBarLayout> 

  @InjectView(R.id.detail_expense_reason) AppCompatTextView originalReason; @InjectView(R.id.detail_expense_reason_trim) AppCompatTextView trimReason; @InjectView(R.id.detail_expense_container) LinearLayout expenseContainer; 

// Manejar evento

 public void onClick() { if (originalReason.getVisibility() == View.VISIBLE) { originalReason.setVisibility(View.GONE); trimReason.setVisibility(View.VISIBLE); } else { originalReason.setVisibility(View.VISIBLE); trimReason.setVisibility(View.GONE); } } 

Es un error del NestedScrollView, el detalle del error se puede encontrar aquí: problema . El problema es que mScroller.isFinished() en onInterceptTouchEvent(MotionEvent ev) no devolverá true después de una operación de fling (incluso si se detiene el fling). Por lo tanto, el evento táctil es interceptado.

Este error se ha informado por un tiempo, pero aún no se han solucionado. Así que he creado por propia versión de corrección de errores para este problema. Implementé mi propio NestedScrollView , copié todo el código de NestedScrollView y teniendo el con las siguientes enmiendas:

 public class NestedScrollView extends FrameLayout implements NestedScrollingParent, NestedScrollingChild { ... private void initScrollView() { ... // replace this line: // mScroller = new ScrollerCompat(getContext(), null); mScroller = ScrollerCompat.create(getContext(), null); ... } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { ... switch (action & MotionEventCompat.ACTION_MASK) { ... case MotionEvent.ACTION_DOWN: { ... // replace this line: // mIsBeingDragged = !mScroller.isFinished(); mIsBeingDragged = false; ... } } } } 

Y este NestedScrollView debe tener el mismo comportamiento que el original.

Es una mención de Google #issues 194398 en Google #issues 194398 .

Sólo tiene que utilizar esta clase WorkaroundNestedScrollView.java que extiende NestedScrollView como,

WorkaroundNestedScrollView.java

 public class WorkaroundNestedScrollView extends NestedScrollView { public WorkaroundNestedScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { // Explicitly call computeScroll() to make the Scroller compute itself computeScroll(); } return super.onInterceptTouchEvent(ev); } } 

Y en yourlayout lo usan así,

Layout.xml

 <com.yourpackagename.whatever.WorkaroundNestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> ... ... </com.yourpackagename.whatever.WorkaroundNestedScrollView> 

Puede encontrar más detalles aquí .

Conocí este problema también

  public class NestedScrollView extends FrameLayout implements NestedScrollingParent, NestedScrollingChild, ScrollingView { @Override public boolean onTouchEvent(MotionEvent ev) { switch (actionMasked) { case MotionEvent.ACTION_DOWN: { if (getChildCount() == 0) { return false; } //add this line if (!inChild((int) ev.getX(), (int) ev.getY())) { return false; } if ((mIsBeingDragged = !mScroller.isFinished())) { final ViewParent parent = getParent(); if (parent != null) { parent.requestDisallowInterceptTouchEvent(true); } } } } 

Y cambio mi archivo xml, cambio paddingTop a margin_top, entonces el evento OnClick de mi vista flotante superior no será interceptado por NestedScrollView

  • Eliminar o ocultar el encabezado de navegaciónVer en android
  • Cómo cambiar el color de la etiqueta de TextinputLayout y edittext subrayar android
  • Cómo configurar la tipografía personalizada en los elementos de NavigationView?
  • CollapsingToolbarLayout | Problemas de desplazamiento y diseño 2
  • Cómo agregar elementos de submenú a NavigationView programaticamente en lugar de menú xml
  • Cómo configurar el color de texto de la barra de ayuda de la biblioteca de soporte a algo que no sea android: textColor?
  • ImageView en CollapsingToolbarLayout no cubre la altura completa?
  • Persistente hoja inferior con vista recicladora
  • Mi FloatingActionButton tiene algunas líneas extrañas que salen de él en 4.4 y menor
  • Cómo escalar la imagen en Android CollapsingToolbarLayout como WunderList hace
  • Fragmentos superpuestos con DrawerLayout / NavigationView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.