2012-05-02 4 views
4

上のダイアログの断片をアニメーション正しい方向?は、私が閉じられたときにアニメーション化するdialogfragmentを取得しようとしている解任

@Override 
public void dismiss() { 
    if (mDismissAnimationFinished) { 
     super.dismiss(); 
    } else { 

     mShrink.setAnimationListener(new Animation.AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation animation) { 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       mDismissAnimationFinished = true; 
       dismiss(); 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 

      } 
     }); 
     mCurrentContainer.startAnimation(mShrink); 
    } 
} 
+0

これらのdimiss/cancel機能が全く呼び出されていない、またはアニメーションが実行されていないという問題は何ですか?またonAnimationEndあなたは、dismiss()を呼び出しています。あなたは最近、映画の開始を見ましたか?) – MikeIsrael

答えて

1

私は普通のダイアログサブクラスでこれを行なったし、私の解決策は正確にDialogFragmentにオーバー転送する必要があります。

非常に近いと思われます。dismiss()ではなく、onAnimationEnd()でsuper.dismiss()を呼び出す必要があります。その理由は、dismiss()を呼び出すと、すでに入っている関数を再帰的に呼び出すためです。

EDIT:

外側のクラスのラッパー・メソッドを定義するかYourDialogFragment.super(とそれを呼び出します)。

void parentDismiss() { super.dismiss() } 

onAnimationEnd()から電話してください。

それでも、あなたはまだあなたがダイアログをキャンセルしているし、それが別のスレッドによって却下されているレースの条件に1つのより多くの問題があるでしょう。この問題を解決するには、最初にあなたのonDismissは(ブールmIsDismissedを設定する)別のonStart()onDismiss()の体が実行されていないこと(あなたが戻ってブール値を反転しONSTART()をオーバーライドします)が発生する前に、それが再び呼び出された場合ように呼ばれています二度。

私はDialogFragment、普通のダイアログを使用しない、ここに解決策を書かれています。それはテストされ、働いているので、私が使っているロジックを見て、それをコピーするか、必要に応じてそれを使用してください。

https://github.com/tom-dignan/nifty/blob/master/src/com/tomdignan/nifty/dialogs/NiftyProgressDialog.java

+1

あなたの匿名クラスであなたはまだYourDialogFragment.superを呼び出すことができると思います。 –

+0

@HelinWangええ、それは間違いなく正しいです。私はずっと前にこれを書きました。修正していただきありがとうございます。 –

1

あなたはリスナーがそのスーパーでクラスを呼び出すだけで座っている外部クラスにアクセスすることができます。このように:

関連する問題