2013-07-29 46 views
5

我有一個DialogFragment,它有一些其視圖內的一些佈局的動畫。 當我關閉對話框時,我想執行動畫,當動畫結束時,執行解除操作。佈局的DialogFragment動畫和「試圖在繪圖時破壞窗口!」錯誤

第一步: 呼叫從我的活動片段:

myDialog.show(getSupportFragmentManager(), ""); 

第2步: 用戶已經完成了與對話的任務後,他按下一個按鈕。該按鈕調用一個動畫之後,我想的對話框消失:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View layout = inflater.inflate(R.layout.my_layout, null); 

     layMain = (LinearLayout) layout.findViewById(R.id.layMain); 

     TextView btnCancel = (TextView) layout.findViewById(R.id.btnCancel); 
      btnCancel.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View arg0) { 
        final Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.translate_to_bottom); 
        anim.setAnimationListener(new AnimationListener() { 

         @Override 
         public void onAnimationStart(Animation animation) { 

         } 

         @Override 
         public void onAnimationRepeat(Animation animation) { 

         } 

         @Override 
         public void onAnimationEnd(Animation animation) { 
          dismiss(); 
         } 
        }); 
        layMain.startAnimation(anim); 
       } 
      }); 
..... 

當動畫結束時,對話框被撤職,但我得到的logcat

E/ViewRootImpl這個錯誤(25507) :試圖在繪圖時摧毀窗戶! E/ViewRootImpl(25507):[email protected], 標題= com.mypackage/com.mypackage.MyActivity

我怎樣才能避免這種情況?

後來編輯:如果我使用它沒有任何動畫,一切工作正常,沒有錯誤顯示logcat。所以我想它必須對動畫做些什麼。

我使用的動畫:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false" > 

    <translate 
     android:duration="@android:integer/config_mediumAnimTime" 
     android:fromYDelta="0%p" 
     android:interpolator="@android:anim/accelerate_interpolator" 
     android:toYDelta="80%p" /> 

</set> 
+1

那意味着你的對話框一直沒有消失? –

+1

對話框按正常期望消失。所以一切都表現正常,除了錯誤信息哪個..並不意味着什麼好。 – Alin

+1

這是因爲你必須通過getSupportFragmentManager()作爲一個上下文對象......等等,而不是它,你必須通過getActivity()...... –

回答

8

,到目前爲止的工作,沒有出現任何的錯誤,唯一的解決辦法是這樣的:

@Override 
public void onAnimationEnd(Animation animation) { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      dismiss(); 
     } 
    }, 10); 

}

我願意接受任何其他sugestions

+1

您不需要10 ms的延遲。你可以簡單地使用'post()'方法。 –

2

你有通片段上下文作爲getSupportFragmentManager()。 所以,你必須改變它:

myDialog.show(getFragmentManager(), ""); 
+1

'void android.support.v4.app.DialogFragment.show(FragmentManager manager,String tag)'需要片段管理器不活動。 – Alin

+1

改變之後,你會得到正確的解決方案 –

+1

我需要使用支持片段經理爲我的應用程序必須兼容於Android 2.2 – Alin

2

我沒有看到任何這樣的問題:

public class MyDIalog extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Button b = new Button(getActivity()); 
     final Dialog d = super.onCreateDialog(savedInstanceState); 
     d.setContentView(b); 

     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       b.animate().rotationYBy(180).setDuration(500).setListener(new Animator.AnimatorListener() { 
        @Override 
        public void onAnimationStart(Animator animator) { 
        } 

        @Override 
        public void onAnimationEnd(Animator animator) { 
         dismiss(); 
        } 

        @Override 
        public void onAnimationCancel(Animator animator) { 
        } 

        @Override 
        public void onAnimationRepeat(Animator animator) { 
        } 
       }); 
      } 
     }); 

     return d; 
    } 

} 

工作正常:

new MyDIalog().show(getFragmentManager(),"dialog"); 

的任何方面,你可以安排dismiss()通話稍後通過使用:

@Override 
public void onAnimationEnd(Animator animator) { 
    getActivity().runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     dismiss(); 
    } 
    }); 
} 
+2

謝謝您的回答開始。不幸的是沒有工作。正如我所說,如果我不使用動畫,錯誤不會發生。與你的代碼不同的是,我正在使用onCreateView和getSupportFragmentManger。也許在支持庫中有一個錯誤? – Alin

+1

@Alin也許,我在ICS平臺的仿真器上測試過,它工作正常。 –

0

您可以使用這樣的。

@Override 
public void onAnimationEnd(Animation animation) { 
    Handler handler = new Handler(); 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      dismiss(); 
     } 
    }); 
} 

這裏的好處是,你沒有定義自己的時間,這樣一來它可以幫助保持一切簡單,用戶甚至可以在很短的時間會讓你大吃一驚,如果對話框沒有保持解僱後動畫結束。