개발 과정
- PopupWindow 만들기
- BottomSheetBehavior 적용하기
1. PopupWindow
private val popupMenu: PopupWindow by lazy {
PopupWindow(
FragmentChatMenuBinding.inflate(layoutInflater).root,
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
true
)
}
private fun popupWindow(isShow: Boolean) {
if (isShow) {
if (!popupMenu.isShowing) {
popupMenu.showAtLocation(
viewDataBinding.bottom,
Gravity.BOTTOM,
0,
viewDataBinding.bottom.height
)
}
} else {
if (popupMenu.isShowing) {
popupMenu.dismiss()
}
}
}
viewDataBidning.bottom => 입력창 ( EditText )
이렇게 입력창 바로 위에 팝업 윈도우를 띄우고
2. 끌어 내릴 수 있도록 BottomSheetBehavior 적용
FragmentChatMenuBinding xml 파일에 CoordinatorLayout 으로 감싸고 원래 ViewGroup에 아래 behavior 추가
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
PopupWindow 수정
lateinit var bottomSheetBehavior: BottomSheetBehavior<ConstraintLayout>
PopupWindow(
FragmentChatMenuBinding.inflate(layoutInflater).apply {
bottomSheetBehavior = from(this.menu)
bottomSheetBehavior.addBottomSheetCallback(object : BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
if (newState == STATE_HIDDEN) {
popupMenu.dismiss()
}
}
override fun onSlide(bottomSheet: View, slideOffset: Float) {
}
})
bottomSheetBehavior.isHideable = true
bottomSheetBehavior.state = STATE_EXPANDED
... (생략)
)
private fun popupWindow(isShow: Boolean) {
if (isShow) {
if (!popupMenu.isShowing) {
bottomSheetBehavior.state = STATE_EXPANDED
... (생략)
}
} else {
if (popupMenu.isShowing) {
popupMenu.dismiss()
}
}
}
정리하자면
팝업윈도우가 켜졌을때 -> Expand
끌어서 내리면 ( HIDDEN ) -> 팝업윈도우 : Dismiss
'Android' 카테고리의 다른 글
카카오톡 채팅화면 키보드 옵션창 구현 (0) | 2022.10.09 |
---|---|
Gson으로 sealed class 로 맵핑하기 (0) | 2022.10.04 |
카카오톡 잠금화면 구현 (0) | 2022.09.29 |
소셜 로그인 모듈화 과정 ( 추상화 및 액티비티 의존성 제거 ) (1) | 2022.09.29 |
transition animation 적용 (0) | 2022.08.14 |