2

我有一个菜单项,ActionBar它启动了AsyncTask,当任务运行时,我让菜单项动画显示进度。我还刷新了我的每个选择的动画,ListView因为菜单项会根据单击的项目而变化。我有一切工作,除了我检查是否AsyncTask正在运行,onCreateOptionsMenu是否重新启动动画(因为在重绘菜单时动画停止)。不确定是否有更好的方法来做到这一点。

这是我必须检查是否AsyncTask正在运行并重新启动一个菜单项的动画的代码:

注意:在代码的其他地方我使用它来重置菜单,如果重要的话:

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);
    }
}

刷新.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" 
/>
4

1 回答 1

0

弄清楚了。我创建了一个名为 StopAnimation 的函数:

private void StopAnimation()
{
    if (refreshItem != null && refreshItem.getActionView() != null) 
    {
        refreshItem.getActionView().clearAnimation();
        refreshItem.setActionView(null);
    }
}

然后在onCreateOptionsMenu我有这个代码:

@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    inflater.inflate(R.menu.main_menu, menu);

    StopAnimation();

    refreshItem = menu.findItem(R.id.filter);

    if (fi != null && fi.getStatus() == AsyncTask.Status.RUNNING)
            this.StartAnimation();

    super.onCreateOptionsMenu(menu, inflater);
}
于 2012-11-06T02:41:54.043 回答