02. 안드로이드_Kotlin : 커스텀 다이얼로그

1. res 파일 생성 및 정의

   - 기본적인 색상 정의 or 레이아웃에 직접 작성

   - values > colors.xml

<color name="white">#FFFFFF</color>
<color name="click_base">#7C7C7C</color>

   - 클릭 모션 이미지 생성

   - res > drawable > btn_click_base.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"
        android:drawable="@color/click_base"/>

    <item android:drawable="@color/white"/>

</selector>

   - 다이얼로그 레이아웃 생성

   - res > layout > dialog_alert.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="200dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:background="#FF4400"
        android:gravity="center"
        android:text="Alert"
        android:textColor="#FFFFFF"
        android:textSize="20dp"
        android:textStyle="bold">
    </TextView>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="6"
        android:text="테스트 메시지"
        android:textColor="#000000"
        android:textSize="20dp"
        android:gravity="center">
    </TextView>

    <View
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.05"
        android:background="#000000">
    </View>

    <Button
        android:id="@+id/alertBtnClose"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:text="닫     기"
        android:textColor="#FF4400"
        android:textSize="15dp"
        android:textStyle="bold"
        android:gravity="center"
        android:background="@drawable/btn_click_base">
    </Button>

</LinearLayout>

   - 엑티비티 레이아웃에 버튼 정의

   - res > layout > activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/stcMainLogin"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <Button
        android:id="@+id/mainBtnA"
        android:layout_width="200dp"
        android:layout_height="80dp"
        android:layout_gravity="center"
        android:text="버튼 A"
        android:textColor="#000000">
    </Button>

    <Button
        android:id="@+id/mainBtnB"
        android:layout_width="200dp"
        android:layout_height="80dp"
        android:layout_gravity="center"
        android:text="버튼 B"
        android:textColor="#000000">
    </Button>

    <Button
        android:id="@+id/mainBtnC"
        android:layout_width="200dp"
        android:layout_height="80dp"
        android:layout_gravity="center"
        android:text="버튼 C"
        android:textColor="#000000">
    </Button>

    <Button
        android:id="@+id/mainBtnD"
        android:layout_width="200dp"
        android:layout_height="80dp"
        android:layout_gravity="center"
        android:text="버튼 D"
        android:textColor="#000000">
    </Button>

</LinearLayout>

 

2. 다이얼로그 코드 작성

   - 위젯 선언 별도 함수로 정리

   - 클릭 이벤트 정의 (다중 클릭 이벤트가 존재할 수 있으므로 onClick 함수로 사용)

   - com.project.mykotlin > dialog > CommAlertDialog

package com.project.mykotlin.dialog

import android.app.Dialog
import android.content.Context
import android.util.Log
import android.view.View
import android.view.WindowManager
import android.widget.Button
import com.project.mykotlin.R
import kotlinx.android.synthetic.main.dialog_alert.*

class CommAlertDialog(context : Context) : View.OnClickListener {

    private val dialog = Dialog(context)
    private var alertBtnClose : Button? = null

    fun CommAlertDg() {
        try {
            //화면 레이아웃 설정
            dialog.setContentView(R.layout.dialog_alert)

            //다이얼로그 크기 설정
            //dialog.window!!.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)

            //다이얼로그 외부 터치 시 닫기 (true : 허용, false : 거부)
            dialog.setCanceledOnTouchOutside(false)

            //다이얼로그 뒤로 가기 버튼으로 닫기 (true : 허용, false : 거부)
            dialog.setCancelable(true)

            //내부 위젯 선언
            commAlertDialogWidgetDeclare()

            //다이얼로그 생성
            dialog.show()

        }catch(e : Exception) {
            Log.e("TLOG", "CommAlertDialog : CommAlertDg 오류 확인 : " + e.toString())

        }

    }

    fun commAlertDialogWidgetDeclare() {
        dialog.alertBtnClose.setOnClickListener(this)

    }

    override fun onClick(v: View) {
        if(v.id == R.id.alertBtnClose) {
            dialog.dismiss()
        }

    }

}

 

3. MainAcitivity 코드 작성

   - onStart 부분에서 리스너 선언 필요

   - com.project.mykotlin > MainActivity

 

package com.project.mykotlin

import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import com.project.mykotlin.dialog.CommAlertDialog
import com.project.mykotlin.dialog.commConfirmDialog

class MainActivity : Activity(), View.OnClickListener {

    var mainBtnA : Button? = null
    var mainBtnC : Button? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        try {
            mainBtnA = findViewById<Button>(R.id.mainBtnA)
            mainBtnC = findViewById<Button>(R.id.mainBtnC)


        }catch(e: Exception) {
            Log.e("TLOG", "onCreate 오류 확인 : " + e.toString())
        }

    }

    fun OnClickListenerSetting() {
        mainBtnA!!.setOnClickListener(this)
        mainBtnC!!.setOnClickListener(this)

    }

    override fun onClick(v: View) {
        try {
            if(v.id == R.id.mainBtnA) {
                Log.e("TLOG", "클릭 테스트!!")

            }else if(v.id == R.id.mainBtnC) {
                openAlertDialog()

            }

        }catch(e : Exception) {
            Log.e("TLOG", "onClick 오류 확인 : " + e.toString())
        }
    }


    fun openAlertDialog()  {
        try {
            var mCommAlertDialog = CommAlertDialog(this);
            mCommAlertDialog.CommAlertDg()

        }catch(e : Exception) {
            Log.e("TLOG", "openAlertDialog 오류 확인 : " + e.toString())

        }

    }

    override fun onStart() {
        super.onStart()
        OnClickListenerSetting()
    }

}

 

4. 실행 확인