본문 바로가기
IT 개발/안드로이드개발

[안드로이드]커스텀 다이얼로그 - ClickListener와 Callback 사용하는 법

by 만능이되고픈 잡캐 2018. 10. 4.

[안드로이드] 커스텀다이얼로그 - ClickListener와 Callback 사용하는 방법


기초없이 무작정 혼자서 만들어보다보니 진짜 기초탄탄이 얼마나 중요한지 새삼 느끼고있다ㅠㅠ..
구현하고 싶었던 기능은 CustomDialog에서 설정하거나 입력한 값을 Dialog가 사라지면서 Activity에 전달해주는 방법이였다.
여러방법들이 있었지만, 잘못사용하면 설계면에서나 효용면에서 좋지않다고 하여 Listener와 Callback을 사용하는 방법을 이용하기로 하였다. 가장 기초 중의 기초였지만 제대로 사용하지 못함에 반성....
그래서 오늘은 CustomDialog에서 ClickListener와 Callback을 사용하는 방법을 적어보려한다.

먼저, 레이아웃을 간단히 구성했다. 레이아웃은 테스트를 위해 신경안쓰고 막 만든 것이니 태클은 자제..ㅠ

    




이제 코드를 보면서 만들어 보겠다.

CustomDialog 와 MainActivity의 기본레이아웃 구성이 다 되어있다는 가정하에 해야할 일을 순서대로 정리해 보았다.





1. CustomDialog에 interface 생성

인터페이스 이름은 간단히 CustomDialogListener라고 정해주었다. 
그리고 확인버튼과 취소버튼이 눌렸을 때의 이벤트를 주기위해 onPositiveClicked와 onNegativeClicked를 생성해주었다.
    //인터페이스 설정
    interface CustomDialogListener{
        void onPositiveClicked(String name, String age, String addr);
        void onNegativeClicked();
    }


2. 리스너 초기화 구현

Activity에서 호출할 리스너를 초기화해주는 메서드이다.
    //호출할 리스너
    public void setDialogListener(CustomDialogListener customDialogListener){
        this.customDialogListener = customDialogListener;
    }


3. CustomDialog에서 확인버튼을 눌렀을 때 interface의 메서드를 호출

확인버튼이 눌렸을 때 interface의 메서드를 호출하여 MainActivity로 넘겨준다.
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnPositive: //확인 버튼을 눌렀을 때
                //각각의 변수에 EidtText에서 가져온 값을 저장
                String name = editName.getText().toString();
                String age = editAge.getText().toString();
                String addr = editAddr.getText().toString();

                //인터페이스의 함수를 호출하여 변수에 저장된 값들을 Activity로 전달
                customDialogListener.onPositiveClicked(name,age,addr);
                dismiss();
                break;
            case R.id.btnNegative: //취소 버튼을 눌렀을 때
                cancel();
                break;
        }
    }



4. MainActivity에서 선언

MainAcitivity에서 다이얼로그를 생성할 때에 리스너를 생성하여
다이얼로그에서 확인버튼이 눌렸을 때의 값을 전달 받는다.
   @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button1:
                CustomDialog dialog = new CustomDialog(this);
                dialog.setDialogListener(new CustomDialog.CustomDialogListener() {
                    @Override
                    public void onPositiveClicked(String name, String age, String addr) {
                        txtName.setText(name);
                        txtAge.setText(age);
                        txtAddr.setText(addr);
                    }

                    @Override
                    public void onNegativeClicked() {

                    }
                });
                dialog.show();
                break;
        }
    }



5. 전체코드


[MainActivity.java]
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button button1;
    private TextView txtName;
    private TextView txtAge;
    private TextView txtAddr;


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

        //init
        button1 = (Button)findViewById(R.id.button1);
        txtName = (TextView)findViewById(R.id.txtName);
        txtAge = (TextView)findViewById(R.id.txtAge);
        txtAddr = (TextView)findViewById(R.id.txtAddr);

        button1.setOnClickListener(this);

    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button1:
                CustomDialog dialog = new CustomDialog(this);
                dialog.setDialogListener(new CustomDialog.CustomDialogListener() {
                    @Override
                    public void onPositiveClicked(String name, String age, String addr) {
                        txtName.setText(name);
                        txtAge.setText(age);
                        txtAddr.setText(addr);
                    }

                    @Override
                    public void onNegativeClicked() {

                    }
                });
                dialog.show();
                break;
        }
    }
}



[Custom.java]
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class CustomDialog extends Dialog implements View.OnClickListener{

    private Button positiveButton;
    private Button negativeButton;
    private EditText editName;
    private EditText editAge;
    private EditText editAddr;
    private Context context;

    private CustomDialogListener customDialogListener;

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


    //인터페이스 설정
    interface CustomDialogListener{
        void onPositiveClicked(String name, String age, String addr);
        void onNegativeClicked();
    }

    //호출할 리스너 초기화
    public void setDialogListener(CustomDialogListener customDialogListener){
        this.customDialogListener = customDialogListener;
    }




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

        setContentView(R.layout.custom_dialog);

        //init
        positiveButton = (Button)findViewById(R.id.btnPositive);
        negativeButton = (Button)findViewById(R.id.btnNegative);
        editName = (EditText)findViewById(R.id.editName);
        editAge = (EditText)findViewById(R.id.editAge);
        editAddr = (EditText)findViewById(R.id.editAddr);


        //버튼 클릭 리스너 등록
        positiveButton.setOnClickListener(this);
        negativeButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnPositive: //확인 버튼을 눌렀을 때
                //각각의 변수에 EidtText에서 가져온 값을 저장
                String name = editName.getText().toString();
                String age = editAge.getText().toString();
                String addr = editAddr.getText().toString();

                //인터페이스의 함수를 호출하여 변수에 저장된 값들을 Activity로 전달
                customDialogListener.onPositiveClicked(name,age,addr);
                dismiss();
                break;
            case R.id.btnNegative: //취소 버튼을 눌렀을 때
                cancel();
                break;
        }
    }
}


6. 구현영상