- 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,但是我认为它会传达一个基本的想法.