Actualizar la animación del elemento de menú en ActionBarSherlock

public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: return true; case R.id.searchIcon: return true; case R.id.startRefresh: refreshItem = item; refresh(); return true; case R.id.stopRefresh: if (refreshItem != null && refreshItem.getActionView() != null) { refreshItem.getActionView().clearAnimation(); refreshItem.setActionView(null); } return true; default: return super.onOptionsItemSelected(item); } } public void refresh() { if (FeedActivity.this != null) { /* * Attach a rotating ImageView to the refresh item as an ActionView */ LayoutInflater inflater = (LayoutInflater) FeedActivity.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); ImageView iv = (ImageView) inflater.inflate( R.layout.refresh_action_view, null); Animation rotation = AnimationUtils.loadAnimation( FeedActivity.this, R.anim.clockwise_refresh); rotation.setRepeatCount(Animation.INFINITE); iv.startAnimation(rotation); refreshItem.setActionView(iv); } } 

Antes de hacer clic:

Introduzca aquí la descripción de la imagen

Después de hacer clic:

Introduzca aquí la descripción de la imagen

Aquí el icono se está animando (girando).

Problema:

¿Por qué está cambiando a la izquierda?

Una vez que se desplaza a la izquierda, el icono se convierte en no clicable y extrañamente el botón de retroceso del dispositivo también no funciona

EDITAR:

En comentarios debajo de esta respuesta:

Icono de Animated para ActionItem

Jake Warton dice que si usted está usando un icono de tamaño cuadrado y correcto para el elemento de menú, no obtendrá este comportamiento extraño, a alguien que tiene el mismo problema.

Pero estoy utilizando una imagen 32×32 en un dispositivo que utiliza mdpi drawables. Que como se ha dicho que debe trabajar 🙁

Gracias

EDITAR:

Refresh_action_view.xml

 <?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/Widget.Sherlock.ActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_refresh" /> 

Estilo personalizado que utilizo en mi aplicación

 <style name="My_solid_ActionBar" parent="@style/Widget.Sherlock.Light.ActionBar.Solid.Inverse"> <item name="background">@drawable/ab_solid_My</item> <item name="backgroundStacked">@drawable/ab_stacked_solid_My</item> <item name="backgroundSplit">@drawable/ab_bottom_solid_My</item> <item name="progressBarStyle">@style/My_ProgressBar</item> <item name="android:background">@drawable/ab_solid_My</item> <item name="android:backgroundStacked">@drawable/ab_stacked_solid_My</item> <item name="android:backgroundSplit">@drawable/ab_bottom_solid_My</item> <item name="android:progressBarStyle">@style/My_ProgressBar</item> </style> 

2 Solutions collect form web for “Actualizar la animación del elemento de menú en ActionBarSherlock”

El problema es que no está manejando la inflación de todos los menús en onCreateOptionsMenu() . La lógica básica para una animación de actualización de ActionBar que he visto usada en aplicaciones con código abierto, por ejemplo Andlytics (y también usé en proyectos), es implementar un indicador boolean en onCreateOptionsMenu() para decidir si se mostrará la animación de actualización.

Se puede implementar de la siguiente manera: Cuando se llama al método refresh() , establece el isRefreshing boolean isRefreshing en true y llama a inValidateOptionsMenu() que "behind the scene" llama a onCreateOptionsMenu() para iniciar la animación:

Inflar el menú en onCreateOptionsMenu(...) :

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); super.onCreateOptionsMenu(menu, inflater); //inflate a menu which shows the non-animated refresh icon inflater.inflate(R.menu.my_ab_menu, menu); if (isRefreshing) { //if we're refreshing, show the animation MenuItem item = menu.findItem(R.id.refreshMenuItem); item.setActionView(R.layout.action_bar_indeterminate_progress); ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView); ((AnimationDrawable) iv.getDrawable()).start(); } } 

Comience la animación de la siguiente manera:

  public void refresh(){ isRefreshing = true; inValidateOptionsMenu(); } 

Si desea que el usuario inicie la animación cuando toque el icono de actualización, haga lo siguiente en onOptionsItemSelected() :

 case R.id.refreshMenuItem: isRefreshing = true; item.setActionView(R.layout.action_bar_indeterminate_progress); ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView); ((AnimationDrawable) iv.getDrawable()).start(); //... 

Para detener la llamada de animación:

 isRefreshing = false; invalidateOptionsMenu(); 

Este código es de un Fragment por lo que puede tener que ajustar si para una Activity , pero creo que comunica la idea básica.

He intentado el mismo código que utiliza y funciona muy bien para mí. Las únicas cosas que podrían ser diferentes son dos cosas:

1) el layout refresh_action_view (aquí está el mío para comparación):

 <?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" style="?attr/actionButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_menu_refresh" /> 

2) Las opciones de visualización de su barra de acción (aquí está mi styles.xml para la comparación).

 <resources> <style name="AppTheme" parent="Theme.Sherlock.Light.DarkActionBar"> <item name="android:actionBarStyle">@style/Widget.ActionBar</item> <item name="actionBarStyle">@style/Widget.ActionBar</item> </style> <style name="Widget.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse"> <item name="android:displayOptions">showHome|useLogo|showCustom</item> <item name="displayOptions">showHome|useLogo|showCustom</item> </style> </resources> 

¿Puede compartir el suyo también?

  • ¿Cómo hacer que la animación de GridView sea como en la aplicación de Google Keep?
  • La vista desaparece cerca del final de la animación RotationY
  • ClipChildren no funciona
  • Cómo eliminar el elemento de RecyclerView con demora
  • ¿Cómo hacer la animación predeterminada del cargador de Android?
  • Actividad de visualización de abajo hacia arriba
  • Repetir AnimatorSet
  • La animación de la vista no cambia el área táctil
  • ANDROID - cómo comprobar si la animación se está ejecutando antes de comenzar la nueva animación
  • Transiciones de retorno de la actividad - Elementos compartidos - Actividad asesinada
  • ¿Cómo crear una animación cambiante de color? (Androide)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.