티스토리 뷰
AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Message")
.create()
.show()
안드로이드에서 제공하는 기본 다이얼로그를 사용하려면 위와 비슷하게 작성하면 된다.
하지만 다이얼로그의 ui를 변경하거나 특정 로직을 더 넣고 싶다면 커스텀 다이얼로그를 구현해야 한다.
커스텀 다이얼로그를 구현하는 방법은 크게 두 가지가 있다.
FragmentDialog를 확장하는 방법과, manifest의 theme를 dialog로 변경하는 방법이다.
< FragmentDialog >
FragmentDialog를 상속받아 구현하는 방법이다.
FragmentDialog도 Fragment의 일종이므로 Fragment의 생명주기를 활용할 수 있다.
Dialog 클래스를 상속받아서 커스텀 다이얼로그를 구현할 수 있는데, 위와 같은 이유로 안드로이드에서는 Dialog를 상속받는 것보다 FragmentDialog를 상속받는 것을 권장하고 있다.
1. dialog xml 파일 생성하기
이 예제에서는 xml 파일명이 dialog_custom이라고 가정했다.
따로 고려할 것없이 필요한 뷰들을 자유롭게 넣으면 된다.
2. dialog 코틀린 파일 작성하기
class CustomDialog : DialogFragment() {
private lateinit var binding: DialogCustomBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = DialogCustomBinding.inflate(inflater, container, false)
dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
isCancelable = false
//...
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
}
}
FragmentDialog를 상속받은 커스텀 다이얼로그의 코틀린 코드다.
이외에 필요한 로직을 추가하면 된다.
이 예제에서는 데이터 바인딩을 사용했다.
dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
FragmentDialog의 기본 크기는 0x0이기 때문에 xml에서 match_parent를 적용해도 화면 전체를 차지하지 않는다.
match_parent를 의도에 맞게 사용하기 위해서는 위 코드를 inflate 후에 작성해야 한다.
만약 다이얼로그의 크기를 전체 화면 기준으로 지정하지 않고, 특정 px나 dp를 사용한다면 이 설정은 굳이 사용하지 않아도 된다.
isCancelable = false
isCancelable을 false로 지정하면 다이얼로그 바깥을 클릭하거나 뒤로 가기 버튼을 눌러도 다이얼로그가 사라지지 않는다.
나는 exit 버튼을 눌러야만 다이얼로그가 닫히도록 구현했기 때문에 false로 두었다.
상황에 맞게 사용하면 될 것 같다!
3. dialog를 띄울 activity 코드
binding.button.setOnClickListener {
CustomDialog().show(supportFragmentManager, "dialog")
}
나는 특정 액티비티에서 버튼을 누르면 커스텀 다이얼로그가 띄워지도록 구현했다.
방금 만든 커스텀 다이얼로그 클래스를 생성하고, show()를 호출해서 화면에 띄운다.
< manifest theme 사용하기 >
Dialog를 하나의 Activity로 사용하는 방법이다.
Activity를 화면에 띄우려면 manifest에 등록해야 하는데, 이 때 theme를 dialog로 설정한다.
1. xml, Activity 코드
일반 xml과 Activity를 구현하는 것과 동일하게 필요한 로직을 적는다.
supportRequestWindowFeature(Window.FEATURE_NO_TITLE)
이때 Activity에서 위 코드 한줄을 onCreate()에 추가한다.
TITLE_BAR가 없어야 다이얼로그처럼 보이기 때문이다.
2. AndroidManifest.xml
<activity android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.DayNight.Dialog">
</activity>
theme를 Dialog로 변경하는 것이 가장 중요하다!
3. dialog를 띄울 activity 코드
binding.button.setOnClickListener {
startActivity(Intent(this, DialogActivity::class.java))
}
Activity에서 Activity로 이동하는 것과 동일하게 Intent를 전달한다.
'app > android' 카테고리의 다른 글
[안드로이드/코틀린] onBackPressed() deprecated 대체 방법, OnBackPressedCallback 알아보기 (0) | 2023.09.23 |
---|---|
[안드로이드/코틀린] Activity와 Fragment 간 데이터 전달하기 (0) | 2023.09.21 |
[안드로이드/코틀린] 데이터 바인딩 (DataBinding) (0) | 2023.09.21 |
[안드로이드/코틀린] RecyclerView 개념 알아보고 구현하기! (0) | 2023.09.21 |
[안드로이드/android] FragmentDialog, CustomDialog match_parent가 안되는 경우 (0) | 2023.09.20 |