1 답변
-
cancel()
/** * Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will * also call your {@link DialogInterface.OnCancelListener} (if registered). */ public void cancel() { if (!mCanceled && mCancelMessage != null) { mCanceled = true; // Obtain a new message so this dialog can be re-used Message.obtain(mCancelMessage).sendToTarget(); } dismiss(); }
위 canel() 메서드는 다음의 단계를 거치게 된다. 그리고 이 메서드는 OnCancelListener로 등록한 객체가 있으면 호출해 준다. -mCancelMessage가 있으면 메시지를 전달한다. -dismiss()를 호출한다.
dismiss()
public void dismiss() { if (Thread.currentThread() != mUiThread) { mHandler.post(mDismissAction); } else { mHandler.removeCallbacks(mDismissAction); mDismissAction.run(); } }
위 dismiss() 메서드는 화면에서 다이얼로그를 종료하는 역할을 하고 스레드 세이프 하다. 스레드 세이프 하다는 것으로 UI 스레드만이 다이얼로그를 종료시킨다는 것도 알 수 있다. 다이얼로그는 mDismissAction.run() 메서드가 종료시킨다. 이 메서드는 dismissDialog() 메서드를 호출하고, 이 메서드에서는 윈도 매니저를 사용해서 다이얼로그를 윈도에서 제거한다.
그리고 다이얼로그가 화면에 보이는 상황에서 백 키를 누르면 아래의 소스와 같이 동작한다. 즉 cancel() 메서드를 호출해서 다이얼로그를 종료시킨다. 따라서 백키의 이벤트로 다이얼로그가 종료하는 상황은 DialogInterface.OnCancelListener 인터페이스를 구현하면 되겠다.
public void onBackPressed() { if (mCancelable) { cancel(); } }
댓글 입력