본문 바로가기
android/kotlin

[Android][Kotlin] 하단 다이얼로그 BottomSheetDialog 구현하기

by 윈 Win 2021. 6. 18.
728x90

 

블로그 이사했습니다!

 

👇 블로그 이전 공지 👇

블로그 이전 안내 (tistory.com)

 

 

👇 새 블로그에서 글 보기 👇

[Android] 하단 다이얼로그 BottomSheetDialog 구현하기 — Win Record (tistory.com)

 

[Android] 하단 다이얼로그 BottomSheetDialog 구현하기

⚠️ 2021.06.18에 작성된 글입니다 ⚠️ BottomSheetDialog란? 화면 하단에 붙어있는 다이얼로그. 아래처럼 여러 방식으로 구성할 수 있다. 구현 방법 BottomSheetDialog 객체 생성해서 만들기 커스텀 다이얼

win-record.tistory.com

 

 


 

BottomSheetDialog란?

화면 하단에 붙어있는 다이얼로그. 아래처럼 여러 방식으로 구성할 수 있다.

구현 방법

  • BottomSheetDialog 객체 생성해서 만들기
  • 커스텀 다이얼로그로 만들기
    • BottomSheetDialog를 상속해서 구현하기
    • BottomSheetDialogFragment를 상속해서 구현하기

 


BottomSheetDialog 객체 생성해서 구현하기

구현 순서

  1. 다이얼로그 레이아웃 만들기
  2. 뷰(activity, fragment)에서 bottomSheetDialog 생성하기

1. 다이얼로그 레이아웃 (dialog_content.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="제목" />
<View
android:layout_width="80dp"
android:layout_height="1dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="15dp"
android:background="@color/purple_700" />
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:text="내용"
android:textAlignment="center" />
</LinearLayout>

 

2. 다이얼로그 생성 (MainActivity.kt)

val dialog: BottomSheetDialog = BottomSheetDialog(this)
dialog.setContentView(R.layout.dialog_content)
val tv = dialog.findViewById<TextView>(R.id.content)
tv?.setOnClickListener {
Toast.makeText(this, "내용을 클릭하였습니다", Toast.LENGTH_LONG).show()
dialog.dismiss()
}
dialog.show()

아래처럼 내용이란 텍스트뷰를 클릭했을 때 토스트가 나타나는 다이얼로그가 생성되었다.

커스텀 다이얼로그로 구현하기

class를 상속할지, fragment를 상속할지에 따라 BottomSheetDialog와 BottomSheetDialogFragment 중 선택해서 커스텀 다이얼로그를 구현하면 된다.

클래스를 상속하는 경우 뷰에서 생성하는 방법이 위의 방법과 동일하다.

따라서 본 글에서는 BottomSheetDialogFragment를 선택해 구현해본다.

 

구현 순서

  1. 다이얼로그 레이아웃 만들기
  2. 커스텀 다이얼로그 구현하기
  3. 뷰(activity, fragment)에서 CustomDialog 생성하기

1. 다이얼로그 레이아웃 (dialog_input.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="horizontal">
<EditText
android:id="@+id/edt_input"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/white"
android:hint="아무 글자를 입력해주세요"
android:inputType="text"
android:padding="10dp">
<requestFocus />
</EditText>
<TextView
android:id="@+id/tv_done"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@color/purple_700"
android:gravity="center"
android:paddingHorizontal="15dp"
android:text="완료"
android:textColor="@color/white" />
</LinearLayout>

 

2. 커스텀 다이얼로그 구현 (CustomDialog.kt)

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
class CustomDialog(private val doneText: String, private val listener: OnClickListener) :
BottomSheetDialogFragment(),
View.OnClickListener {
lateinit var tvDone: TextView
val mTag = "커스텀 다이얼로그"
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
super.onCreateView(inflater, container, savedInstanceState)
val view: View = inflater.inflate(R.layout.dialog_input, container, false)
// 텍스트뷰 세팅
tvDone = view.findViewById<TextView>(R.id.tv_done)!!
tvDone.setOnClickListener(this)
tvDone.text = doneText
return view
}
interface OnClickListener {
fun onClick(dialog: CustomDialog)
}
override fun onClick(p0: View?) {
listener.onClick(this)
}
}

생성자로 텍스트뷰에 세팅할 문자열과 클릭 리스너를 받는다.

 

3. 다이얼로그 생성 (MainActivity.kt)

val customDialog = CustomDialog("입력하기", object : CustomDialog.OnClickListener {
override fun onClick(dialog: CustomDialog) {
Toast.makeText(
this@MainActivity,
dialog.tvDone.text.toString(),
Toast.LENGTH_LONG
).show()
dialog.dismiss()
}
})
customDialog.show(supportFragmentManager, customDialog.mTag)

아래와 같이 TextView를 클릭했을 때 EditText의 글자를 토스트 띄워주는 다이얼로그가 완성된다.

댓글