support last android android-support-library appcompat

last - com.android.support:design 26



Snackbar y otras animaciones dejaron de funcionar en algunos dispositivos Android (3)

Tengo un problema muy extraño que no puedo resolver. No tuve problemas hasta hace poco, pero parece que no puedo volver atrás para evitarlo. También la otra cosa extraña es que funciona en algunos dispositivos y otros no.

El tema es animaciones. Uno en particular es el snack bar. El snackbar debe animar hacia arriba y hacia abajo, pero no lo es. solo se muestra y luego se esconde. Revise el video a continuación para ver el problema.

Video de emisión

Aquí está el código de Android para animar el snackbar en

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { ViewCompat.setTranslationY(mView, mView.getHeight()); ViewCompat.animate(mView) .translationY(0f) .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) .setDuration(ANIMATION_DURATION) .setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationStart(View view) { mView.animateChildrenIn(ANIMATION_DURATION - ANIMATION_FADE_DURATION, ANIMATION_FADE_DURATION); } @Override public void onAnimationEnd(View view) { onViewShown(); } }).start(); }

Su uso de ViewCompat para la biblioteca v4. Tengo otras animaciones trabajando en otra actividad trabajando bien. Además, el problema no está en una sola actividad, sino en todas. Eso me hace pensar que su sistema es amplio de alguna manera. Pero todos ellos usan diferentes temas internos, pero todos extienden Theme.AppCompat.NoActionBar.

Aquí está mi diseño principal

<android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:elevation="4dp"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:titleTextAppearance="@style/ToolbarTitle" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways|snap"/> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabTextAppearance="@style/TabText" app:tabMinWidth="@dimen/tab_minwidth" app:tabMode="fixed" app:tabGravity="fill" app:layout_scrollFlags="enterAlways"/> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> <fr.castorflex.android.circularprogressbar.CircularProgressBar android:id="@+id/base_progressSpinner" android:layout_gravity="center" android:layout_width="48dp" android:layout_height="48dp" android:indeterminate="true" android:visibility="invisible" app:cpb_color="@color/spinner" app:cpb_rotation_speed="1.0" app:cpb_sweep_speed="1.0" app:cpb_stroke_width="4dp" app:cpb_min_sweep_angle="10" app:cpb_max_sweep_angle="300"/> <android.support.design.widget.FloatingActionButton android:id="@+id/fab_upload" android:visibility="gone" android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_anchor="@id/content_frame" app:layout_anchorGravity="bottom|right|end" app:borderWidth="0dp" android:src="@drawable/app_fab_upload" android:layout_margin="@dimen/big_padding" android:clickable="true" app:backgroundTint="@color/fab_social"/> <android.support.design.widget.FloatingActionButton android:id="@+id/fab_muzei" android:visibility="gone" android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_anchor="@id/content_frame" app:layout_anchorGravity="bottom|right|end" app:borderWidth="0dp" android:src="@drawable/app_fab_muzei" android:layout_margin="@dimen/big_padding" android:clickable="true" app:backgroundTint="@color/fab_social"/> </android.support.design.widget.CoordinatorLayout>

Dispositivos en los que funciona

  • Nexus 9 (Marshmallow)
  • Nexus 4 (KitKat)
  • Galaxy S7 (Marshmallow)

Dispositivos no funciona

  • Droid Turbo 2 (Marshmallow)
  • Galaxy S7 (Marshmallow) * mi dispositivo funciona, mis probadores no lo hacen
  • Nexus 6p (Android N)

Los otros problemas de animación son con interruptores. Tengo 2 en el mismo diseño y uno tartamudea cuando se cambia y el otro simplemente cambia sin animación.

También tengo un LayoutTransition configurado en mi AppBarLayout para animar el ocultamiento / visualización de mi TabLayout y funciona bien y en todos los dispositivos


Como mencionó Bignadad, el problema es que cualquier característica de accesibilidad, incluidos los gestores de contraseñas, desactiva las animaciones de la barra de aperitivos. Google, a partir de esta edición, ha corregido esto para AndroidX pero no para la biblioteca de soporte de diseño

Debido a que la clase base de Snackbar, BaseTransientBottomBar, maneja la animación, con un paquete privado, métodos finales, tiene dos opciones si quiere arreglarlo: haga rodar su propia barra de snack desde cero, o use una solución más intrépida con reflexión:

Ejemplo de Kotlin:

// Only force when necessary, and don''t animate when TalkBack or similar services are enabled val shouldForceAnimate = !accessibilityManager.isEnabled && accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN).isEmpty() Snackbar.make(coordinatorLayout, text, duration).apply { if (shouldForceAnimate) { try { val accManagerField = BaseTransientBottomBar::class.java.getDeclaredField("mAccessibilityManager") accManagerField.isAccessible = true val accManager = accManagerField.get(this) AccessibilityManager::class.java.getDeclaredField("mIsEnabled").apply { isAccessible = true setBoolean(accManager, false) } accManagerField.set(this, accManager) } catch (e: Exception) { Log.d("Snackbar", "Reflection error: $e") } } }.show()

Ejemplo de java

// Only force when necessary, and don''t animate when TalkBack or similar services are enabled boolean shouldForceAnimate = !accessibilityManager.isEnabled() && accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN).size == 0; Snackbar snackbar = Snackbar.make(coordinatorLayout, text, duration); if(shouldForceAnimate){ try { Field accManagerField = BaseTransientBottomBar.class.getDeclaredField("mAccessibilityManager"); accManagerField.setAccessible(true); AccessibilityManager accManager = (AccessibilityManager) accManagerField.get(snackbar); Field isEnabledField = AccessibilityManager.class.getDeclaredField("mIsEnabled"); isEnabledField.setAccessible(true); isEnabledField.setBoolean(accManager, false); accManagerField.set(snackbar, accManager); } catch (Exception e) { Log.d("Snackbar", "Reflection error: " + e.toString()); } } snackbar.show();

Me encantaría una tercera opción aquí, pero no tengo conocimiento de una, al menos hasta que AndroidX salga de la versión beta con la solución adecuada.


Encontré la razón por la que esto está sucediendo, pero no cómo solucionarlo todavía.

/** * Returns true if we should animate the Snackbar view in/out. */ private boolean shouldAnimate() { return !mAccessibilityManager.isEnabled(); }

Eso lo llama la clase Snackbar y es falso en los dispositivos que funcionan, y verdadero en los dispositivos que no funcionan. ¿Alguien sabe acerca de esto?

Así que después de que deshabilité Lastpass en la configuración de mi sistema, la accesibilidad de la barra de snack ahora se anima como debería. Eso es una locura cómo funciona eso. El lanzador Nova tiene el mismo efecto. Supongo que cualquier servicio de accesibilidad que esté habilitado hará que la animación de la barra no funcione.


Esto se ha solucionado desde la publicación de componentes de material para Android 1.0.0-alpha3.

Úselo en lugar de la Biblioteca de diseño (que es el camino a seguir si está utilizando AndroidX ):

implementation "com.google.android.material:material:$material_components_version"