3

FragmentActivity で、ユーザーがクリックすると actionBar で時計回りのアニメーションを実行し、AsyncTask が終了すると停止する MenuItem を作成します。これは、更新を開始および停止するときに使用するコードです。

public void completeRefresh(MenuItem menuItem) {
     if(menuItem!=null){
         if(menuItem.getActionView()!=null){
             menuItem.getActionView().clearAnimation();
             menuItem.setActionView(null);
         }
     }
 }

 public void refresh(MenuItem menuItem) {
     /* Attach a rotating ImageView to the refresh item as an ActionView */
     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     ImageView iv = (ImageView) inflater.inflate(R.layout.refresh_action_view, null);

     Animation rotation = AnimationUtils.loadAnimation(this, R.anim.clockwise_refresh);
     rotation.setRepeatCount(Animation.INFINITE);
     iv.startAnimation(rotation);

     menuItem.setActionView(iv);
 }

これはうまく機能しますが、フラグメントを切り替えると問題が発生します。Activity は、2 つのフラグメントを含む ViewPager で構成されます。アニメーション付きの ActionView の進行中にフラグメントを切り替えると、新しい Fragment に 2 つの時計回りの MenuItem が表示され、一方が他方をアニメーション化します。そしてアニメーションは決して終わらない。これは問題のスクリーンショットです。どうすればそれを回避できますか?フラグメントを切り替えると

4

2 に答える 2

2

問題は、2 つの独立しFragments処理ActionBarと、状態を示す共通の 1 つがあることです。

あなたの場合、ActionBarフラグメント自体からではなく、からの状態を管理するのが最善FragmentActivityです。あなた(およびフラグメント)をFragmentActivityホストします。とそのフラグメントViewPagerの状態に応じて、コールバックを使用して に通知し、 の状態を変更します。ViewPagerFragmentActivityActionBar

例 (PSEUDO):

   onViewPagerPageChanged(..){
       refreshActionBar();
   }

   onButtonClickedInFragment1(..){
       ... //do again something with the ActionBar but don't let the Fragment be the owner
   }

アイテムを追加/削除/編集した後は、ActionBar を無効にすることを忘れないでください。

   getActionBar().invalidateOptionsMenu();
于 2014-05-01T09:13:58.800 に答える
-2

フラグメントからsetHasOptionMenu(true)を削除するだけで解決しました。

于 2013-03-22T01:18:07.790 に答える