開始するメニュー項目がActionBar
ありAsyncTask
、タスクの実行中に進行状況を表示するためにアニメーション化するメニュー項目があります。ListView
また、クリックする項目によってメニュー項目が変わるため、選択するたびにアニメーションを更新しています。AsyncTask
が実行されているかどうかを確認しonCreateOptionsMenu
、アニメーションを再開することを除いて、すべてが機能しています(メニューを再描画するとアニメーションが停止するため)。しかし、これを行うためのより良い方法があるかどうかはわかりません。
AsyncTask
これは、が実行されているかどうかを確認し、1つのメニュー項目のアニメーションを再開する必要があるコードです。
注:重要な場合は、コードの他の場所でこれを使用してメニューをリセットしています。
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
activity.invalidateOptionsMenu();
public class MyFragment extends SherlockListFragment
{
private MenuItem refreshItem;
private AsyncTask<Void, String, Void> fi;
private MenuItem refreshItem;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
fi = new FetchItems(activity, null);
fi.execute(); //this actually happen when the menu item is selected but I put here for this question
}
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.main_menu, menu);
if (fi != null && fi.getStatus() == AsyncTask.Status.RUNNING)
{
if (refreshItem != null && refreshItem.getActionView() != null)
{
refreshItem.getActionView().clearAnimation();
refreshItem.setActionView(null);
this.StartAnimation();
}
}
else
refreshItem = menu.findItem(R.id.filter);
super.onCreateOptionsMenu(menu, inflater);
}
private class FetchItems extends AsyncTask<Void, String, Void>
{
@Override
protected void onPreExecute()
{
StartAnimation();
}
protected void onPostExecute(final Void unused)
{
if (refreshItem != null && refreshItem.getActionView() != null)
{
refreshItem.getActionView().clearAnimation();
refreshItem.setActionView(null);
}
}
}
private void StartAnimation() {
final LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null);
final Animation rotation = AnimationUtils.loadAnimation(getActivity(), R.anim.refresh);
ivRefresh.startAnimation(rotation);
refreshItem.setActionView(ivRefresh);
}
}
refresh.xml
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:interpolator="@android:anim/linear_interpolator"
android:duration="1000"
/>