Android Custom Dialogを作成し、ClickLister定義を使用してクリックイベントを定義します.



個人的にはアンドロイドの基本ダイヤルデザインが好きではありません.💦 基本色を低状態で変更しても、1つのプロンプトウィンドウでAPP全体を分散させる設計コンセプトを考慮して、基本プロンプトウィンドウのダイヤルアップレコードをすべてカスタマイズすることができます.

作成するCustom Dialog.TextViewは、複数ページ(activity,fragment)用の固定文ではなくパラメータ化された文を提供します.

🎈 設計-xml合成


まずdialog_confirm.xmlファイルを作成します.Buttonスタイルは筆者が単独で定義したもので、自分のスタイルに合わせて設計することができます.
dialog_confirm.xml

<?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:background="@drawable/view_round_white_6"
    android:gravity="center"
    android:minWidth="300dp"
    android:orientation="vertical"
    android:padding="20dp">

    <TextView
        android:id="@+id/confirmTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:minHeight="50dp"
        android:textSize="14sp"
        tools:text="확인창입니다." />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/noButton"
            style="@style/MainOutlineButton"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginEnd="7dp"
            android:layout_weight="1"
            android:text="취소"
            android:textSize="14sp" />

        <Button
            android:id="@+id/yesButton"
            style="@style/MainFillButton"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="확인"
            android:textSize="14sp" />

    </LinearLayout>
    
</LinearLayout>
枠線を丸くするにはdrawableで次のファイルを作成し、dialog_confirm.xmlの最高レイアウトbackgroundに適用します.
view_round_white_6.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <corners android:radius="6dp" />
</shape>

🎈 Custom Dialogクラスの作成


削除するid値を渡す必要があるため、id値をパラメータとして入れますが、単純にアクティビティを終了したり、()を終了したりしたい場合は、パラメータを受信する必要はありません.
ダイヤルアップログdismiss()のみを終了したい場合は、次のDialogクラスで終了を定義できますが、アクティビティfinish()を終了したい場合は、インタフェースを介してアクティビティの動作を定義する必要があります.
class ConfirmDialog(
    confirmDialogInterface: ConfirmDialogInterface,
    text: String, id: Int
) : DialogFragment() {

    // 뷰 바인딩 정의
    private var _binding: DialogPackageDeleteBinding? = null
    private val binding get() = _binding!!

    private var confirmDialogInterface: ConfirmDialogInterface? = null
    
    private var text: String? = null
    private var id: Int? = null

    init {
        this.text = text
        this.id = id
        this.confirmDialogInterface = confirmDialogInterface
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = DialogPackageDeleteBinding.inflate(inflater, container, false)
        val view = binding.root
        
        // 레이아웃 배경을 투명하게 해줌, 필수 아님
        dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

        binding.confirmTextView.text = text

        // 취소 버튼 클릭
        binding.noButton.setOnClickListener {
            dismiss()
        }
        
        // 확인 버튼 클릭
        binding.yesButton.setOnClickListener {
            this.confirmDialogInterface?.onYesButtonClick(id!!)
            dismiss()
        }

        return view
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

interface ConfirmDialogInterface {
    fun onYesButtonClick(id: Int)
}

🎈 使用するアクティビティまたはクリップから呼び出す


必要なactivityまたはfragmentでカスタムダイヤルとインタフェースを定義すると終了します.

ここで少し指摘します。🙋🏻‍♀️


dialog.show(manager:FragmentManager,tag:String)呼び出し時にmanagerに渡す値!
  • activity ➡ this.supportFragmentManager
  • fragment ➡ activity?.supportFragmentManager!!
  • class MainActivity : AppCompatActivity(), ConfirmDialogInterface {
    
        private lateinit var binding: ActivityMainBinding
        
        ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
            
            clickViewEvents()
        }
        
        // 뷰 클릭 이벤트 정의
        private fun clickViewEvents() {
            // 삭제 버튼 클릭
            binding.deleteButton.setOnClickListener {
                val dialog = ConfirmDialog(this, "패키지를 삭제하시겠습니까?", pkgId)
                // 알림창이 띄워져있는 동안 배경 클릭 막기
                dialog.isCancelable = false
                dialog.show(this.supportFragmentManager, "ConfirmDialog")
            }
        }
        
        override fun onYesButtonClick(id: Int) {
            // 액티비티 종료를 원한다면 finish()를 호출해주면 되겠죵 :)
            deletePackageApiCall(id)
        }
    }