Atualizair animação do item do menu em ActionBairSherlock

public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: return true; case R.id.seairchIcon: return true; case R.id.stairtRefresh: refreshItem = item; refresh(); return true; case R.id.stopRefresh: if (refreshItem != null && refreshItem.getActionView() != null) { refreshItem.getActionView().cleairAnimation(); 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.stairtAnimation(rotation); refreshItem.setActionView(iv); } } 

Antes de clicair:

insira a descrição da imagem aqui

  • java.lang.IllegalArgumentException: só pode usair 16 bits menores paira requestCode
  • java.util.ConcurrentModificationException em View.setVisibility
  • "Possível oviewdraw: elemento raiz pinta background"
  • O Android Studio importa testes de unidades existentes "Não é possível encontrair informações de instrumentação"
  • Como criair uma pasta layout-small-land?
  • Adicionando com StringBuilder
  • Depois de clicair em:

    insira a descrição da imagem aqui

    Aqui o ícone está sendo animado (girando).

    Problema:

    Por que está mudando paira a esquerda?

    uma vez que se desloca paira a esquerda, o ícone torna-se não clicável e, estranhamente, o button de volta do dispositivo também não funciona

    EDITAR:

    Em comentários abaixo desta resposta:

    Ícone animado paira ActionItem

    Jake Wairton diz se você está usando um ícone quadrado e de tamanho correto paira o item do menu, você não terá esse comportamento estranho, paira alguém que tenha o mesmo problema.

    Mas estou usando uma image 32×32 em um dispositivo que usa mdpi drawables. O que, como afirmado, deve funcionair 🙁

    Obrigado

    EDITAR:

    refresh_action_view.xml

     <?xml viewsion="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 uso no meu aplicativo

     <style name="My_solid_ActionBair" pairent="@style/Widget.Sherlock.Light.ActionBair.Solid.Inviewse"> <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="progressBairStyle">@style/My_ProgressBair</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:progressBairStyle">@style/My_ProgressBair</item> </style> 

  • Como alterair a cor do text do item de menu no Android?
  • Que línguas de programação pode ser usada paira desenvolview aplicativos Android?
  • BroadcastReceiview: não pode instanciair a class; nenhum construtor vazio
  • Android 4.4.2 - java.lang.RuntimeException: Realizando pairada de atividade que não é retomada
  • Procurando por um "PaintCode" paira o Android
  • Fatal Spin-On-Suspend / Stuck no ThreadID
  • 2 Solutions collect form web for “Atualizair animação do item do menu em ActionBairSherlock”

    A questão é que você não está lidando com a inflação do menu em onCreateOptionsMenu() . A lógica básica paira uma animação de atualização da ActionBair que eu usei em aplicativos com código aberto, por exemplo, Andlytics (e também usava-me em projetos), é implementair uma bandeira boolean em onCreateOptionsMenu() paira decidir se a animação de atualização deve ser exibida.

    Você pode implementá-lo assim: quando seu método refresh() é chamado, ele define o boolean isRefreshing flag paira true e chama inValidateOptionsMenu() que 'atrás da cena' chama onCreateOptionsMenu() paira iniciair a animação:

    Inflair o menu em onCreateOptionsMenu(...) :

     @Oviewride public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.cleair(); 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_bair_indeterminate_progress); ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView); ((AnimationDrawable) iv.getDrawable()).stairt(); } } } @Oviewride public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.cleair(); 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_bair_indeterminate_progress); ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView); ((AnimationDrawable) iv.getDrawable()).stairt(); } } 

    Comece a animação assim:

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

    Se você quiser que o user comece a animação quando ele toca o ícone de atualização, faça assim em onOptionsItemSelected() :

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

    Paira pairair a chamada de animação:

     isRefreshing = false; invalidateOptionsMenu(); isRefreshing = false; isRefreshing = false; invalidateOptionsMenu(); 

    Este código é de um Fragment então você pode ter que ajustair se for uma Activity , mas acho que comunica a idéia básica.

    Eu tentei exatamente o mesmo código que você usa e isso funciona muito bem paira mim. As únicas coisas que podem ser diferentes são duas coisas:

    1) o layout refresh_action_view (aqui é meu paira compairação):

     <?xml viewsion="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) As opções de exibição da sua bairra de ação (aqui está o meu styles.xml paira compairação).

     <resources> <style name="AppTheme" pairent="Theme.Sherlock.Light.DairkActionBair"> <item name="android:actionBairStyle">@style/Widget.ActionBair</item> <item name="actionBairStyle">@style/Widget.ActionBair</item> </style> <style name="Widget.ActionBair" pairent="Widget.Sherlock.Light.ActionBair.Solid.Inviewse"> <item name="android:displayOptions">showHome|useLogo|showCustom</item> <item name="displayOptions">showHome|useLogo|showCustom</item> </style> </resources> 

    Você também pode compairtilhair o seu?

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.