관리 메뉴

나만을 위한 블로그

[Android] 커스텀 다이얼로그에서 데이터 바인딩 사용하는 법 본문

Android

[Android] 커스텀 다이얼로그에서 데이터 바인딩 사용하는 법

참깨빵위에참깨빵_ 2021. 6. 9. 00:43
728x90
반응형

데이터 바인딩을 사용하면 기존에 사용하던 findViewById()를 사용하지 않아도 된다는 장점이 있어 코드량이 줄어드는 걸 볼 수 있다.

그래서 액티비티/프래그먼트에서 주로 사용하는데 이걸 커스텀 다이얼로그에서도 쓸 수 있지 않을까?

당연히 가능하다.

 

먼저 데이터 바인딩을 사용하기 위해 xml에 필요한 처리는 모두 해줘야 한다.

<layout>
    <data>
        <variable
            name="이름 작성"
            type="com.example.testproj.dialog.CustomDialog" />
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .
        .
        .

<layout> 태그 안에 부모 레이아웃을 넣어준다. 자식 레이아웃과 위젯 등은 당연히 부모 레이아웃 안에 있을 것이다.

그리고 <variable> 태그 안에 필요한 내용들을 작성해준다.

 

다음은 액티비티/프래그먼트에서 다이얼로그를 띄워주기 위한 public 메서드를 만들어야 한다.

이 때 아래와 같이 처리해준다.

// 아래 2줄은 전역변수로 선언한다. context는 생성자 매개변수로 넘기기 위해 선언했다
private Context context;
private MyDialogBinding binding;
.
.
.
public CustomEditNicknameDialog(Context context)
    {
        this.context = context; // 생성자에서 받은 컨텍스트를 커스텀 다이얼로그의 컨텍스트 변수에 매핑
    }
.
.
.
public void showDialog()
    {
        final Dialog dialog = new Dialog(context);
        binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.my_dialog, null, false);
    }

액티비티/프래그먼트에서 커스텀 다이얼로그를 띄워주려면 컨텍스트가 필요하다.

그래서 그 컨텍스트를 매개변수로 넘겨서 다이얼로그 객체를 얻은 다음, 전역변수에 선언한 데이터 바인딩 변수에 inflate()로 미리 만들어둔 커스텀 다이얼로그 xml을 연결해준다.

저 inflate()의 원형은 아래와 같다.

// @Nullable don't annotate with Nullable. It is unlikely to be null and makes using it from
    // kotlin really ugly. We cannot make it NonNull w/o breaking backward compatibility.
    public static <T extends ViewDataBinding> T inflate(@NonNull LayoutInflater inflater,
            int layoutId, @Nullable ViewGroup parent, boolean attachToParent) {
        return inflate(inflater, layoutId, parent, attachToParent, sDefaultComponent);
    }

아무튼 저렇게 선언해두면 그 다음부터는 binding을 참조해 xml에 만들어 둔 위젯, 레이아웃 등에 접근해 액티비티/프래그먼트 xml에서 했듯 다양한 처리가 가능해진다.

binding.textEraseView.setOnClickListener(//)

주의할 것은 데이터 바인딩을 사용하면 카멜 표기법으로 뷰 이름을 적어줘야 하지만 이는 몇 번 써보면 금방 익숙해질 것이다.

반응형
Comments