๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋ง๋ค๋ ์ค, ๋ค์ด์ผ๋ก๊ทธ ๋ชจ์๋ฆฌ๋ฅผ ๋ฅ๊ธ๊ฒ ํด์ผ๋๋ค.
๋น์ฐํ ๋ ๊ฒ์ด๋ผ๋ ์๊ฐ์ผ๋ก ๊ฐ์ฅ ๋ฐ๊นฅ ๋ ์ด์์์ ์ด๋ ๊ฒ ์ ์ํด์ ์ฌ์ฉํ๋๋ฐ,
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
app:cardCornerRadius="20dp">
![](https://blog.kakaocdn.net/dn/cUFkSF/btsv7WttXIz/0Jn0TI9ytzKld0xWMUoKzK/img.png)
์ด๋ฐ์์ผ๋ก ๋ด๊ฐ ์ง์ ํ ๋ฐฐ๊ฒฝ ๋ฐ๊นฅ์๋ ๋ ๋ฐฐ๊ฒฝ์ด ์ด์์๋ ๊ฒ์ ํ์ธํ๋ค. ๋ฐฉ๋ฒ์ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ, ์ฝ๋์์ ์ง์ ์ง์ ํด์ฃผ๋ฉด ํด๊ฒฐ๋๋ ๋ฌธ์ ์๋๋ฐ
AlertDialog ์ธ์คํด์ค์ ์๋ ์ฝ๋์ ๊ฐ์ด ์์ฑ์ ์ง์ ํด์ฃผ๋ฉด๋๋ค.
alertDialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
![](https://blog.kakaocdn.net/dn/dEkgsQ/btsv7zL3bGA/B12wlkgl00wahyMnicGqAk/img.png)
์ด ๋ ์ฌ์ง์ผ๋ก ์ ์ ์๋๊ฑด, layout์ ์ ์๋ background๋ง๊ณ background๊ฐ ๋ ์๋ค๋ ๊ฒ์ธ๋ฐ, ์ด์ ๋น์ทํ ์๋ฅผ ๋ค์๋ฉด, Theme์์ ์ ํ๋๋ฐ Button์ ์คํ์ผ์ด ์๋ฐ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ฌ๊ธฐ์ ๋ฒ์จ ๋์น ์ฑ ์ฌ๋์ด ์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค. ์ด ๋ฌธ์ ๋ AlertDialog๊ฐ ๊ฐ๋ Style์ด ๊ธฐ๋ณธ์ผ๋ก ์ง์ ๋์ด ์์ด์ ์๊ธฐ๋ ๊ฒ์ด์๋ค.
AlertDialog๋ฅผ ๋ง๋๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋ณด๊ฒ ๋ค.
private fun initDialog(binding: ViewDataBinding) {
val dialogBuilder = AlertDialog.Builder(context)
.setView(binding.root)
.setCancelable(false)
alertDialog = dialogBuilder.create()
alertDialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
alertDialog.show()
}
AlertDialog API์ Builder๋ฅผ ์ด์ฉํด ๋ง๋ค์ด์ง๊ณ , setView์์ ์ง์ ํด๋ ๋ ์ด์์ํ์ผ๊ณผ ์ฐ๊ฒฐํ๋ค. ์ฌ๊ธฐ์๋ ์ ๋ฌธ์ ๋ฅผ ์์์ฐจ๋ฆด ์ ์๋๋ฐ, AlertDialog๋ก ๋ค์ด๊ฐ๋ณด๋ฉด ๋ฐ๋ก ์ ์ ์๋ค.
/**
* Construct an AlertDialog that uses an explicit theme. The actual style
* that an AlertDialog uses is a private implementation, however you can
* here supply either the name of an attribute in the theme from which
* to get the dialog's style (such as {@link R.attr#alertDialogTheme}.
*/
protected AlertDialog(@NonNull Context context, @StyleRes int themeResId) {
super(context, resolveDialogTheme(context, themeResId));
mAlert = new AlertController(getContext(), this, getWindow());
}
์ฌ๋ฌ ์์ฑ์ ์ค ํ๋์ธ๋ฐ, ์์ฑํ ๋ Theme์ ๊ฐ์ ธ์จ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๊ฐ์ ธ์ค๋ Theme์ ์๋์ ๊ฐ๋ค.
public static final int Theme_Material_Dialog_Alert
์ด๊ฒ๋๋ฌธ์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์์๋ ๊ฒ์ด๊ณ (Dark, Light mode ๋ชจ๋ ์ง์ํ๊ณ ์๋ค.) ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ปค์คํ ๋ค์ด์ผ๋ก๊ทธ ํ ๋ง๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋์ง, ์์ ๋ฐฐ๊ฒฝ์ ํฌ๋ช ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก alertDialogTheme ์์ฑ์ ๋ฐ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ํ ๋ง์์ ์ง์ ํด๋๋ฉด ๋๋ค.
์ปค์คํ ํ ๋ง๋ values/theme.xmlํ์ผ์์ ์๋ณด๋ฉด๋๋๋ฐ,
<style name="Theme.ShyPolarBear" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="alertDialogTheme">@style/CustomAlertDialog</item>
</style>
<style name="CustomAlertDialog" parent="Theme.AppCompat.Dialog.Alert">
<item name="colorAccent">@color/Black_01</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
ํด๋น parent ํ ๋ง๋ฅผ ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ๋ฉด Base.Theme.AppCompat๊ฐ ๋์ค๋๋ฐ ์ฌ๊ธฐ ์ฌ๋ ค๋ ํ ๋ ํ์ํ ์์ฑ์ overrideํด์ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๊ผญ ์๋ ์์ฑ์ ์๋ ๊ฒ๋ง ์ง์ ํ ํ์ ์์ด ๊ทธ๋ฅ ๊ธฐ์กด Theme์๋ ์ฌ์ฉํ๋ colorAccent์ ๊ฐ์ ์์ฑ์ ์ง์ ํ๋ฉด ์ง์ ํ ์์ฑ์ ํด๋น AlertDialog์์๋ง ์ ์ฉ๋๋ค๋ ์ ๋ ๊ธฐ์ตํ์.
<style name="Base.V7.Theme.AppCompat.Dialog" parent="Base.Theme.AppCompat">
<item name="android:colorBackground">?attr/colorBackgroundFloating</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowTitleStyle">@style/RtlOverlay.DialogWindowTitle.AppCompat</item>
<item name="android:windowTitleBackgroundStyle">@style/Base.DialogWindowTitleBackground.AppCompat</item>
<item name="android:windowBackground">@drawable/abc_dialog_material_background</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@style/Animation.AppCompat.Dialog</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="windowActionBar">false</item>
<item name="windowActionModeOverlay">true</item>
<item name="listPreferredItemPaddingLeft">24dip</item>
<item name="listPreferredItemPaddingRight">24dip</item>
<item name="android:listDivider">@null</item>
<item name="android:buttonBarStyle">@style/Widget.AppCompat.ButtonBar.AlertDialog</item>
<item name="android:borderlessButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
<item name="android:windowCloseOnTouchOutside">true</item>
</style>
์ฐธ์กฐ:
https://developer.android.com/reference/android/R.style#Theme_Material_Dialog_Alert
"๋๊ธ, ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์๋ฉด ํฐ ํ์ด ๋ฉ๋๋ค"