상세 컨텐츠

본문 제목

[Android] 커스텀 다이얼로그(CustomDialog) 구현하기 ClickListener, callback 기능추가

안드로이드

by 삽질하는 개발자 2022. 1. 20. 23:07

본문

안드로이드에서 다이얼로그는 정말 많이 사용합니다.

이번에는 액티비티에서 다이얼로그를 호출하고, 다이얼로그의 데이터를 다시 액티비티로 넘겨주는 작업을 진행해보겠습니다.

 

소스코드가 길어지면 보기도, 이해하기도 힘들어서 최대한 간단하게 작성하였고, XML파일은.... 더 간단하게 구현했습니다. 

XML파일은 필요하게 수정하시면 될듯하네요.ㅎㅎㅎ

 

전체소스는 맨 아래에!

1. 먼저 CustomDialog 클래스를 생성해줍니다.

Dialog 를 extends 해주고, View.OnclickListener를 implements해줍니다.

 

CustomDialog.java

public class CustomDialog extends Dialog implements View.OnClickListener {


    public CustomDialog(@NonNull Context context) {
        super(context);
    }

    @Override
    public void onClick(View view) {

    }
}

 

2. 인터페이스 구현

CustomDialog 클래스를 생성해줬다면 interface를 구현해줍니다.

interface 이름은 CustomDialogInterface로 지었고,

noBtnClicked, noBtnClicked를 생성

각각 ok버튼과 no버튼이 눌렸을 때 발생시킬겁니다.

 

CustomDialog.java

    interface CustomDialogInterface{
        void okBtnClicked(String btnName);
        void noBtnClicked(String btnName);
    }

 

3. 리스너 초기화

액티비티에서 호출할 리스너를 초기화 해줍니다.

CustomDialog.java

    public void setDialogListener(CustomDialogInterface customDialogInterface){
        this.customDialogInterface = customDialogInterface;
    }

 

4.다이얼로그의 버튼을 누르면 인터페이스의 함수 호출

ok버튼 클릭하면 인터페이스의 okBtnClicked 함수 호출

no버튼 클릭하면 인터페이스의 noBtnClicked 함수 호출

 

CustomDialog.java

    public void onClick(View v) {

        switch (v.getId()){
            case R.id.dlg_ok_btn:
                //mBtnName 변수에 "ok btn"이라는 string 데이터를 넣고, 메인 액티비티로 보냄 
                mBtnName = "ok btn";
                customDialogInterface.okBtnClicked(mBtnName);
                dismiss();
                break;
            case R.id.dlg_no_btn:
                //mBtnName 변수에 "no btn"이라는 string 데이터를 넣고, 메인 액티비티로 보냄
                mBtnName = "no btn";
                customDialogInterface.noBtnClicked(mBtnName);
                dismiss();
                break;
        }

    }

5. 메인액티비티에서 커스텀 다이얼로그를 호출

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.main_ok_btn:

                CustomDialog customDialog = new CustomDialog(this);
                customDialog.setDialogListener(new CustomDialog.CustomDialogInterface() {
                    @Override
                    public void okBtnClicked(String btnName) {
                        //다이얼로그 okBtnClicked 클릭했을 때 콜백
                        Log.e("onPositiveClicked","name:" +btnName);
                    }
                        //다이얼로그 noBtnClicked 클릭했을 때 콜백
                    @Override
                    public void noBtnClicked(String btnName) {
                        Log.e("onNegativeClicked","name:" +btnName);
                    }
                });

                customDialog.show();
                break;
        }

    }

 

이렇게 하시면 다이얼로그에서

ok버튼을 누르면 메인액티비티에서 mBtnName에 ok btn 데이터를

no버튼을 누르면 메인액티비티에서 mBtnName에 no btn 데이터를 받으실 수 있습니다.

 

전체 소스코드

MainActivity.java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    Button mDlgCallBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDlgCallBtn = findViewById(R.id.dlg_call_btn);
        mDlgCallBtn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.dlg_call_btn:
                
                //다이얼로그 선언 
                CustomDialog customDialog = new CustomDialog(this);
                customDialog.setDialogListener(new CustomDialog.CustomDialogInterface() {
                    @Override
                    public void okBtnClicked(String btnName) {
                        //다이얼로그 okBtnClicked 클릭했을 때 콜백
                        Log.e("onPositiveClicked","name:" +btnName);
                    }
                        //다이얼로그 noBtnClicked 클릭했을 때 콜백
                    @Override
                    public void noBtnClicked(String btnName) {
                        Log.e("onNegativeClicked","name:" +btnName);
                    }
                });

                //다이얼로그 호출 
                customDialog.show();
                break;
        }

    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/dlg_call_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="다이얼로그 호출"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

CustomDialog.java

package com.example.myapplication;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.annotation.NonNull;

public class CustomDialog extends Dialog implements View.OnClickListener {

    private CustomDialogInterface customDialogInterface;
    private Context context;
    private Button mDlgOkBtn, mDlgNoBtn;

    public String mBtnName;

    //인터페이스 선언 
    interface CustomDialogInterface{
        void okBtnClicked(String btnName);
        void noBtnClicked(String btnName);
    }

    //리스너 초기화 
    public void setDialogListener(CustomDialogInterface customDialogInterface){
        this.customDialogInterface = customDialogInterface;
    }

    public CustomDialog(@NonNull Context context) {
        super(context);
        this.context = context;
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setContentView(R.layout.dialog_custom);

        mDlgOkBtn = findViewById(R.id.dlg_ok_btn);
        mDlgNoBtn = findViewById(R.id.dlg_no_btn);

        mDlgOkBtn.setOnClickListener(this);
        mDlgNoBtn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.dlg_ok_btn:
                //mBtnName 변수에 "ok btn"이라는 string 데이터를 넣고, 메인 액티비티로 보냄 
                mBtnName = "ok btn";
                customDialogInterface.okBtnClicked(mBtnName);
                dismiss();
                break;
            case R.id.dlg_no_btn:
                //mBtnName 변수에 "no btn"이라는 string 데이터를 넣고, 메인 액티비티로 보냄
                mBtnName = "no btn";
                customDialogInterface.noBtnClicked(mBtnName);
                dismiss();
                break;
        }

    }
}

dialog_custom.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/dlg_ok_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="#ffffff"
        android:text="ok"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

    <Button
        android:id="@+id/dlg_no_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="#ffffff"
        android:text="no"
        app:layout_constraintTop_toBottomOf="@+id/dlg_ok_btn"
        app:layout_constraintBottom_toBottomOf="parent"/>


</androidx.constraintlayout.widget.ConstraintLayout>

관련글 더보기