땀이 삐질삐질 나는 개발 일기

FindViewById() 대체제 Databinding 본문

개발 Tip

FindViewById() 대체제 Databinding

삐질 2019. 7. 19. 22:59
안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.

이번 시간에는 우리가 기본적으로 안드로이드에서 XML과 연결할 때  View의 아이디를 찾아 연결하게 됩니다.

하지만  xml에 만들었던 View Component마다  Java class에서 매번 멤버 변수로 선언 해 주기에는

우리의 손가락 관절이 너무 아프다는 현실이 존재합니다.

그 대안을 위한 것으로 Databinding을 소개하려 합니다.
  • Databinding이 현재 소개하려는 목적을 주목적으로 하진 않습니다.
  • 지금 소개하는 이유는 부가적인 기능으로써 소개하는 것일 뿐입니다.

Databinding이 무엇일까요?

Data 를 View와 묶는 것을 뜻합니다.  안드로이드 구조에서는 XML파일의 루트 뷰그룹 아래에 
<layout></layout>으로 감싸주게 된다면 내부 자동생성 로직에 의하여 태그로 묶인 xml이 
Auto Generating 되어서 각 View Component의 세부적인 사항들이 BindingGenerated 클래스에 담겨지게 됩니다.

예시로 아래 코드를 보겠습니다.

먼저 App Level의 Gradle파일에 

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.ppizil.renderactivityitem_from_recyclerview"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

요렇게 dataBidning{ enabled =true } 코드만 추가해주시면 기본적으로 데이터 바인딩의 세팅이 되었습니다.
다음으로 xml코드

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <androidx.recyclerview.widget.RecyclerView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/reyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    </androidx.recyclerview.widget.RecyclerView>
</layout>

이렇게 작성을 하시고 (보통은 수~초 후 자동으로 안스가 Auto Generating을 해주지만,) Build를 누르게 되시면


요렇게 클래스가 생기게 됩니다.  ( <layout></layout>)으로 묶은 xml들에 한하여 생성됩니다.

이렇게 생성이 되었다면, 우리는 실제 MainActivity.java 또는 View를 다루는 Class에서 


이렇게 접근이 가능합니다.
setContentView(R.layout.activity_main) 과 DatabindingUtil.~~이 같은 역할을 합니다.

이로써 우리는 일일이 액티비티에 TextView textview = FindViewById(Rid.text); 같은 번거로운 작업을 하지 않아도 되게 되었습니다.

  • 주의 : 각 Activity, Fragment , Adapter에서 binding 객체를 할당하는 방법은 다릅니다.

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

    //1. activity
    binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
}

--------------
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    //2. fragment
    binding = DataBindingUtil.inflate(inflater,R.layout.activity_main,container,false);

    return binding.getRoot();
}

-------------
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //3. adapter
    ItemEntityBinding binding = ItemEntityBinding.inflate(LayoutInflater.from(parent.getContext()),false);
    return new ItemViewHolder(binding.getRoot());
}


각 상화에 맞게 사용해주시면 되겠습니다.

이상 Databinding의 간단한 소개였습니다.



안드로이드 초보 개발자를 위해 아래와 같은 카카오 오픈톡을 운영 중입니다


Comments