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
- DrawableLeft se está superponiendo con una sugerencia con TextInputLayout android
- Cómo animar FloatingActionButton de la nueva biblioteca de soporte de diseño
- Tablayout de la biblioteca de soporte de diseño de Android mediante el diseño de pestañas personalizadas, pero el diseño que envuelve las pestañas
- Cómo administrar código para diferentes diseños para soportar todos los dispositivos
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); } }
- Impedir que RecyclerView se desplace en AppBarLayout antes de que AppBarLayout se colapse.
- Forma de indicador de pestaña personalizada en Diseño de soporte de Widget TabLayout
- Comportamiento extraño de AutoCompleteTextView en el dispositivo LolliPop
- Cómo agregar sombra a la FAB proporcionada con la biblioteca de diseño de soporte de Android?
- Cómo crear AppBarLayout que se superpone contenido de CoordinatorLayout
- Las devoluciones de llamadas CoordinatorLayout.Behavior no activan
- Android - Disposición del coordinador, diseño de cajones y fragmentos
- FloatingActionButton, botón cuadrado debajo del nivel API 17
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