feat(modal): V2 공통 모달창을 추가한다

This commit is contained in:
2026-07-08 14:20:27 +09:00
parent bc6443e5bd
commit 8e086c4888
4 changed files with 314 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
package kr.co.vividnext.sodalive.v2.components.modal
import android.app.Activity
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AlertDialog
import androidx.core.graphics.drawable.toDrawable
import kr.co.vividnext.sodalive.databinding.DialogV2ModalBinding
import kr.co.vividnext.sodalive.extensions.dpToPx
class V2ModalDialog(
activity: Activity,
layoutInflater: LayoutInflater,
title: String,
desc: String,
confirmButtonTitle: String,
confirmButtonClick: () -> Unit,
cancelButtonTitle: String = "",
cancelButtonClick: (() -> Unit)? = null
) {
private val alertDialog: AlertDialog
private var isButtonClicked = false
val dialogView = DialogV2ModalBinding.inflate(layoutInflater)
init {
val dialogBuilder = AlertDialog.Builder(activity)
dialogBuilder.setView(dialogView.root)
alertDialog = dialogBuilder.create()
alertDialog.setCancelable(false)
alertDialog.window?.setBackgroundDrawable(Color.TRANSPARENT.toDrawable())
dialogView.tvTitle.text = title
dialogView.tvDesc.text = desc
dialogView.tvCancel.text = cancelButtonTitle
dialogView.tvCancel.setOnClickListener {
dismissAndRun {
cancelButtonClick?.invoke()
}
}
dialogView.tvConfirm.text = confirmButtonTitle
dialogView.tvConfirm.setOnClickListener {
dismissAndRun(confirmButtonClick)
}
dialogView.tvCancel.visibility = if (cancelButtonTitle.isNotBlank()) {
View.VISIBLE
} else {
View.GONE
}
}
fun show(width: Int) {
alertDialog.show()
val lp = WindowManager.LayoutParams()
lp.copyFrom(alertDialog.window?.attributes)
lp.width = width - (26.7f.dpToPx()).toInt()
lp.height = WindowManager.LayoutParams.WRAP_CONTENT
alertDialog.window?.setBackgroundDrawable(Color.TRANSPARENT.toDrawable())
alertDialog.window?.attributes = lp
}
private fun dismissAndRun(action: () -> Unit) {
if (isButtonClicked) return
isButtonClicked = true
alertDialog.dismiss()
action()
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/gray_900" />
<corners android:radius="@dimen/radius_14" />
</shape>

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/bg_v2_modal"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/bold"
android:gravity="center"
android:minHeight="64dp"
android:paddingHorizontal="@dimen/spacing_20"
android:textColor="@color/white"
android:textSize="20sp"
tools:text="모달" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/regular"
android:gravity="center"
android:lineSpacingMultiplier="1.45"
android:padding="@dimen/spacing_20"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="모달 안내 문구가\n들어가는 부분입니다." />
<LinearLayout
android:id="@+id/layout_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingHorizontal="@dimen/spacing_20"
android:paddingVertical="@dimen/spacing_14"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/spacing_8"
android:layout_weight="1"
android:fontFamily="@font/medium"
android:gravity="center"
android:padding="@dimen/spacing_14"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="취소" />
<TextView
android:id="@+id/tv_confirm"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/medium"
android:gravity="center"
android:padding="@dimen/spacing_14"
android:textColor="@color/soda_400"
android:textSize="18sp"
tools:text="확인" />
</LinearLayout>
</LinearLayout>