Change Dialog to DialogFragment

2020. 4. 10. 23:07IssueNote

[20.04.10]

 

목적

 Animation Progress로 사용 중인 CustomDialog(Dialog 확장)에서 Background(out side) 터치 비활성화

 

Dialog

 dialog.setCancelAble(false)

dialog.setCancelAble(false) 

 이 옵션은 dialog의 영역 안의 이벤트를 처리하는데, Dialog의 Style 내용과 교차로 적용되지 않는다.

 

 적용된 Style 

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item> 
<item name="android:windowNoTitle">true</item> 
<item name="android:windowIsFloating">true</item> 
<item name="android:backgroundDimEnabled">false</item>

 

<item name="android:windowIsFloating">true</item> 

 테스트로 이 옵션과 충돌이 나는 것을 확인하고 다이얼로그의 레이아웃을 match_parent로 xml과 programmatically 하게 둘 다 적용해도 똑같이 중심에 애니메이션 이미지를 포함하여 조그마한 영역만 dialog의 레이아웃으로 잡히는 것을 확인했습니다.

 

 programmatically로 transparent 속성을 부여하면 레이아웃에 제대로 속성이 부여되지 않습니다.
(반복된 시도에도 이유를 찾을 수 없었습니다...)
백그라운드의 반투명을 적용해야 하기 때문에 위의 style은 가져가야 했고, 레이아웃은 일부만 잡히니 touch event나 click event는 잡을 수 없었습니다.


 Dialog는 간단한 Yes No 팝업에 사용하기 좋지만 레이아웃을 커스텀하고 이벤트를 다양하게 처리하기 위해 DialogFragment를 사용했습니다.

 

 

DialogFragment 

 

 No Style

dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
isCancelable = false

두 가지 속성을 사용하고 위의 문제를 해결했습니다. 

 

Background touch와 custom layout을 사용하시려면 DialogFragment를 추천합니다.

 

 

추가로 

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
	return object : Dialog(activity, theme) {
		override fun onBackPressed() {  
			// implement
		}
	}
}

 

DialogFragment에서 BackPressed 이벤트를 커스텀할 수 있는 방법입니다.

 

 

 

더 좋은 방법이 있다면 알려주세요!

'IssueNote' 카테고리의 다른 글

RSA private or public key is null(android with Kotlin)  (0) 2020.04.25