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
- Android NavigationView grupo de menús divider
- ¿Existe una alternativa a NestedScrollView para su uso con un WebView?
- Pestaña con icono usando TabLayout en Android Design Library
- AppBarLayout con contenedor FrameLayout como contenido de desplazamiento no funciona
- ¿Cómo crear un divisor simple en el nuevo NavigationView?
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); } }
- Android SnackBar: error al inflar SnackbarLayout
- Comportamiento extraño de AutoCompleteTextView en el dispositivo LolliPop
- CoordinatorLayout no funciona
- La imagen de Parallax no se muestra correctamente en la biblioteca de soporte 24.2.0
- ¿Cómo ocultar y mostrar correctamente la barra de acciones con la nueva API de la biblioteca de diseño?
- Menu y Autohide FloatingActionButton de Android Design Support Library
- ¿Cómo agregar "Android Design Support Library" a Eclipse con ADT-plugin?
- Android: el pie de página se desplaza cuando se usa en CoordinatorLayout
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