[안드로이드] 커스텀 다이얼로그 [2] - ClickListener, Callback


지난 포스팅에선 커스텀 다이얼로그를 생성하고 보여주는 것을 해보았습니다.

이번엔 커스텀 다이얼로그 안에서의 클릭 이벤트 (ClickListener) 를 어떻게 다루는지에 대해 설명해드리도록 하겠습니다.

일단 쉽게 생각하면 다이얼로그도 View 에 속하는 컴포넌트로

다루는 방법이 크게 다르지 않다는 점입니다.

먼저 간단하게 CustomDialog 에서 ClickListener 를 등록해보도록 하겠습니다.

그 이후에 Activity -> Dialog -> Activity 로 파라미터를 넘기는 것을 구현하겠습니다.


먼저 결과입니다.

1. Result

2. Step by Step

2-1. ClickListener 등록

  • 먼저 다이얼로그에 있는 컴포넌트들 (TextView) 에 Id 를 통해 TextView 객체를 가져왔었습니다. 그 객체에 setOnClickListener 를 설정하겠습니다.

    cancelTv = (TextView) findViewById(R.id.findPwDialogCancelTv);
    searchTv = (TextView) findViewById(R.id.findPwDialogFindTv);
    
    cancelTv.setOnClickListener(this);
    searchTv.setOnClickListener(this);
    

2-2. onClick 메소드 구현

  • class 를 정의해준 부분에 클릭 리스너를 implements 합니다.

    public class CustomDialog extends Dialog implements View.OnClickListener{
    
  • onClick 메소드를 Override 해줍니다.

    @Override
    public void onClick(View v) {
    switch (v.getId()){
        case R.id.findPwDialogCancelTv:
            cancel();
            break;
        case R.id.findPwDialogFindTv:
            String email = emailEt.getText().toString();
            String name = nameEt.getText().toString();
            dialogListener.onPositiveClicked(email,name);
            dismiss();
            break;
    }
    }
    
  • onClick 메소드 안에서 각자가 원하는 기능을 구현하면됩니다.




추가

위 부분까지 하셨다면 클릭 이벤트 처리까지 완료됩니다.

하지만 다이얼로그의 결과 값이나

Dialog 를 호출한 Activity ( 혹은 Fragment) 에 리턴해주고 싶은 경우 아래 사항을 진행합니다.


2-4 DialogListener 작성

  • 인터페이스인 DialogListener (이름은 편한걸로 하셔도 됩니다.) 를 작성합니다. 여기에선 Activity에서 어떤 메소드로 어떤 변수의 형태로 결과 값을 전달 받을지 정합니다.

  • 이번 예제에선 다이얼로그에서 입력한 email 과 name 를 MainActivity 에서 다시 가공하고 싶어 매개 변수를 문자열로 하였습니다.

    public interface MyDialogListener {
    public void onPositiveClicked(String email,String name);
    public void onNegativeClicked();
    }
    


2-5. CustomDialog 에서 선언

  • CustomDialog 에서 인터페이스를 멤버 변수로 선언해줍니다.

    public class CustomDialog extends Dialog implements View.OnClickListener{
    
    private MyDialogListener dialogListener;
    
  • 선언해준 MyDialogListener 를 초기화 해줄 메소드를 작성해줍니다.

    public void setDialogListener(MyDialogListener dialogListener){
    this.dialogListener = dialogListener;
    }
    
  • 마지막으로 인터페이스의 메소드를 호출해 값을 MainActivity 로 넘겨줍니다.

    case R.id.findPwDialogFindTv:
    String email = emailEt.getText().toString();
    String name = nameEt.getText().toString();
    dialogListener.onPositiveClicked(email,name);  // 인터페이스의 메소드를 호출 
    dismiss();
    break;
    

2-6. MainActivity 에서 선언

  • 메인 액티비티에선 다이얼로그를 show() 하기 전에 리스너를 등록해주기만 하면 됩니다.

    requestName = nameEt.getText().toString();
    CustomDialog dialog = new CustomDialog(this,requestName);
    dialog.setDialogListener(new MyDialogListener() {  // MyDialogListener 를 구현
    @Override
    public void onPositiveClicked(String email, String name) {
        setResult(email,name);
    }
    
    @Override
    public void onNegativeClicked() {
        Log.d("MyDialogListener","onNegativeClicked");
    }
    });
    dialog.show();
    break;
    
  • MyDialogListener() 를 구현하고 onPositivieClicked 메소드가 호출될 때 사용할 메소드를 정의합니다.

이메일과 이름을 TextView 에 보여주는 기능입니다.

private void setResult(String email,String name){
    resultEmailTv.setText(email);
    resultNameTv.setText(name);
}

3. Source Code

전체 소스 코드는 Github 에 연동해놨습니다.



[Custom dialog 시리즈]

  1. [안드로이드] 커스텀 다이얼로그 [1] - 생성
  2. [안드로이드] 커스텀 다이얼로그 [2] - ClickListener, Callback - 현재 글