2012-05-02 141 views
4

我試圖獲得一個dialogfragment來關閉動畫 - 我試圖覆蓋解僱,onDismiss,onCancel和onDestroy方法如下,沒有運氣 - 有人能指出我在正確的方向?關閉對話框片段的動畫

@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準確。

看起來你非常接近,只是你應該在onAnimationEnd()中調用super.dismiss()而不是dismiss()。原因是,如果您撥打dismiss(),它將遞歸調用您已經在的功能!

編輯:

定義的包裝方法在外部類或YourDialogFragment.super稱之爲()。

void parentDismiss() { super.dismiss() } 

並從您的onAnimationEnd()調用。

即使這樣,當您取消對話框並且正被另一個線程解散時,您仍然會遇到另一個競爭條件問題。要解決這個問題,請在第一次調用onDismiss()時設置布爾型mIsDismissed,以便在另一個onStart()發生之前再次調用它(您將覆蓋onStart()以翻轉布爾返回)onDismiss()的主體未執行兩次。

我在這裏寫了一個解決方案,它不使用DialogFragment,只是一個普通的對話框。它經過測試和工作,所以只要看看我使用的邏輯並複製它,或者如果你願意的話,就可以使用它。

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

+1

我認爲你仍然可以在你的匿名類中調用YourDialogFragment.super。 –

+0

@HelinWang是的,這是絕對正確的。我很久以前寫了這個。謝謝你的糾正。 –

1

在聽衆坐在只需通過調用類的超您可以訪問外部類。像這樣:Classname.super.method()

public void dismiss() { 

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

     @Override 
     public void onAnimationEnd(Animation animation) { 
      classNameOfYourDialog.super.dismiss(); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) {} 
    }); 
}