개발(Android)/android studio

[Android Studio/Kotlin] Custom Dialog, Interface

shinyelee 2022. 4. 20. 00:02

[안드로이드 스튜디오/코틀린] 커스텀 다이얼로그, 인터페이스

MainActivity.kt

package com.shinyelee.android_study2

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast

// 메인화면
class MainActivity : AppCompatActivity(), MyCustomDialogInterface {

    val TAG: String = "로그"

    // 뷰 생성
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 그릴 xml 뷰 파일을 연결(설정) 시켜줌
        setContentView(R.layout.activity_main)

    }

    fun onDialogBtnClicked(view: View) {
        Log.d(TAG, "MainActivity - onDialogBtnClicked() called")

        val myCustomDialog = MyCustomDialog(this, this)

        myCustomDialog.show()
    }

    // 구독 버튼 클릭
    override fun onSubscribeBtnClicked() {
        Log.d(TAG, "MainActivity - onSubscribeBtnClicked() called")
        Toast.makeText(this, "구독!", Toast.LENGTH_LONG).show()
    }

    // 좋아요 버튼 클릭
    override fun onLikeBtnClicked() {
        Log.d(TAG, "MainActivity - onLikeBtnClicked() called")
        Toast.makeText(this, "좋아요!", Toast.LENGTH_LONG).show()
    }

}

MyCustomDialog.kt

package com.shinyelee.android_study2

import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.util.Log
import android.widget.Button

class MyCustomDialog(context: Context,
                     MyCustomDialogInterface: MyCustomDialogInterface)
                    : Dialog(context) {

    val TAG: String = "로그"

    private var myCustomDialogInterface: MyCustomDialogInterface? = null

    // 인터페이스 연결
    init {
        this.myCustomDialogInterface = MyCustomDialogInterface
    }

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

        setContentView(R.layout.custom_dialog)

        Log.d(TAG, "MyCustomDialog - onCreate() called")
        // 배경 투명
        window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

        findViewById<Button>(R.id.subscribe_btn).setOnClickListener {
            Log.d(TAG, "MyCustomDialog - 구독 버튼 클릭됨")
            this.myCustomDialogInterface?.onSubscribeBtnClicked()
        }

        findViewById<Button>(R.id.like_btn).setOnClickListener {
            Log.d(TAG, "MyCustomDialog - 좋아요 버튼 클릭됨")
            this.myCustomDialogInterface?.onLikeBtnClicked()
        }

    }

}

custom_dialog.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center"
        android:gravity="center"
        android:background="@drawable/rounded_corner_line"
        android:padding="40dp">

        <de.hdodenhof.circleimageview.CircleImageView
            android:layout_width="150dp"
            android:layout_height="150dp"
            android:src="@drawable/paw"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="신예리의 개발자취"
            android:layout_marginVertical="20dp"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textColor="#000" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="안녕하세요!\n구독!좋아요!\n부탁드립니다!!"
            android:textAlignment="center"
            android:lineSpacingExtra="5dp"
            android:layout_marginBottom="10dp" />

        <Button
            android:id="@+id/subscribe_btn"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:text="구독!"
            android:textColor="#fff"
            android:textStyle="bold"
            android:layout_marginVertical="10dp"
            android:background="@drawable/rounded_corner_orange" />

        <Button
            android:id="@+id/like_btn"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:text="좋아요!"
            android:textColor="#fff"
            android:textStyle="bold"
            android:layout_margin="10dp"
            android:background="@drawable/rounded_corner_blue" />

    </LinearLayout>

</FrameLayout>

MyCustomDialogInterface.kt

package com.shinyelee.android_study2

interface MyCustomDialogInterface {

    fun onSubscribeBtnClicked()
    fun onLikeBtnClicked()

}

메모

// 강의에서는 kotlin-android-extensions 사용
// ViewBinding으로 하면 왜인지 모르겠으나 setOnClickListener 안 먹힘
// -> 안드로이드 스튜디오 3.6 Canary 11 이상에서만 적용된다고 합
// -> 다른 프로젝트때문에 당분간 3.0 Arctic Fox 써야 함
// -> 결국 findViewById로 바꾸며 불필요한 코드 늘어남

// 버튼에 리스너 통해 행동 직접 정의하면 인터페이스 쓸 필요 없는데 굳이 쓴 이유는?
// -> 일하다보면 비슷한 상황에서 인터페이스 구현하고
//    액티비티에서 클릭이벤트 알아야 하는 경우가 있다고 함

결과물

버튼을 클릭하면
다이얼로그 창이 띄워지며
구독 버튼을 클릭하거나
좋아요 버튼을 클릭하면
각 버튼에 대응하는 토스트 메시지가 뜸


참고

반응형