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

  • Cambiar el color de fondo de una pestaña en TabLayout (biblioteca de soporte de diseño de Android) no ocupa todo el espacio de tabulación
  • Fragmentos superpuestos con DrawerLayout / NavigationView
  • Eliminar o ocultar el encabezado de navegaciónVer en android
  • Clickable CardView dentro de NestedScroll no activa el desplazamiento
  • ¿Cómo puedo determinar que CollapsingToolbar está contraído?
  • Ocultar AppBarLayout y dar su espacio a la vista restante
  • ¿Cómo puedo obtener el elemento de menú en NavigationView?
  • Cambiar color de sugerencia de EditText cuando se utiliza TextInputLayout
  • ¿Cuál es la mejor manera de establecer el tabmode de tabulación de tablas?
  • Despliegue anidado de ListView en la API <21
  • Persistente hoja inferior con vista recicladora
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.