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); } }
点击前:
点击后:
这里的图标正在动画(旋转).
问题:
为什么会向左转?
一旦它向左移动,该图标变得不可点击,并且奇怪的是,设备返回按钮也不起作用
编辑:
在这个答案下面的评论中:
杰克·沃顿(Jake Warton)说如果您正在使用正方形和正确尺寸的图标,那么您就不会再遇到这个奇怪的行为,对于有同样问题的人来说.
但是我在使用mdpi drawables的设备上使用32×32映像.其中哪一个必须工作:(
谢谢
编辑:
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" />
我在我的应用程序中使用自定义样式
<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>
解决方法
问题是您没有处理onCreateOptionsMenu()中的所有菜单通胀. ActionBar刷新动画的基本逻辑是在开放源代码的应用程序中使用,例如
Andlytics(也用于项目中),是在onCreateOptionsMenu()中实现一个布尔标志来决定是否显示刷新动画.
您可以这样实现:当您调用refresh()方法时,将布尔值isRefreshing标志设置为true,并调用onCreateOptionsMenu()后面的inValidateOptionsMenu()来启动动画:
在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(); } }
开始动画如下:
public void refresh(){ isRefreshing = true; inValidateOptionsMenu(); }
如果您希望用户在点击刷新图标时启动动画,请在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(); //...
停止动画通话:
isRefreshing = false; invalidateOptionsMenu();
这段代码来自一个Fragment,所以你可能需要调整一个Activity,但是我认为它会传达一个基本的想法.