2

AsyncTask에서 시작하는 내 ActionBar의 메뉴 항목이 있는데 작업이 실행되는 동안 진행 상황을 표시하기 위해 메뉴 항목이 애니메이션으로 표시됩니다. 또한 어떤 항목을 클릭했는지에 따라 메뉴 항목이 변경되기 때문에 모든 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); 
    } 
} 

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" 
/> 
+0

당신이'ANIM/refresh.xml'을 추가하시기 바랍니다 수 있습니까? – sriramramani

+0

@sriramramani가 refresh.xml을 사용하여 OP를 업데이트했습니다. –

답변

0

는 그것을 알아 냈다. 나는 StopAnimation라는 함수를 만들어 :

onCreateOptionsMenu에서 다음
private void StopAnimation() 
{ 
    if (refreshItem != null && refreshItem.getActionView() != null) 
    { 
     refreshItem.getActionView().clearAnimation(); 
     refreshItem.setActionView(null); 
    } 
} 

이 코드가 있습니다

@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); 
} 
관련 문제