public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
return true;
case R.id.searchIcon:
I tried the exact same code you use and it works just fine for me. The only things that might be different are two things:
1) the refresh_action_view layout (here's mine for comparison):
<?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) The display options of your action bar (here's my styles.xml for comparison).
<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>
Can you share yours as well?
The issue is that you're not handling all menu inflation in onCreateOptionsMenu()
. The basic logic for an ActionBar
refresh animation I've seen used in apps with open source , for example Andlytics (and also used myself in projects), is to implement a boolean
flag in onCreateOptionsMenu()
to decide whether to show the refresh animation.
You can implement it like this: When your refresh()
method is called, it sets the boolean
isRefreshing
flag to true and calls inValidateOptionsMenu()
which 'behind the scene' calls onCreateOptionsMenu()
to start the animation:
Inflate the menu in 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();
}
}
Start animation like so:
public void refresh(){
isRefreshing = true;
inValidateOptionsMenu();
}
If you want the user to start the animation when he taps the refresh icon, do like this in 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();
//...
To stop the animation call:
isRefreshing = false;
invalidateOptionsMenu();
This code is from a Fragment
so you may have to tweak if for an Activity
, but I think it communicates the basic idea.