2

開始するメニュー項目が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" 
/>
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 に答える