본문 바로가기

나의 플랫폼/안드로이드

[Android] DataBinding - findViewById 이제 안녕~

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

정말 구글은 개발자에게 친절한 듯 하네요.

좋은 라이브러리가 있어서 공유 하고자 합니다.


DataBinding을 할 수 있는 라이브러리인데요. 

https://developer.android.com/topic/libraries/data-binding/index.html#studio_support


제가 이 라이브러리로 설명하고자 하는 내용은 아래 입니다.


1. findViewById는 이제 사용하지 않아도 된다.

2. 각 View를 전역 변수로 저장해서 사용하지 않아도 된다.

3. 각 View를 해당 View에 맞게 캐스트 할 필요가 없다.


The Data Binding Library offers both flexibility and broad compatibility — it's a support library, so you can use it with all Android platform versions back to Android 2.1 (API level 7+).

To use data binding, Android Plugin for Gradle 1.5.0-alpha1 or higher is required.


위와 같이 api 7 이상 Gradle plugin인은 1.5.0-alpha1 이상을 사용하라고 하네요. 참고하세요.




그럼 기존의 사용하던 형식을 볼까요?


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
TextView mTxtHello;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTxtHello = (TextView) findViewById(R.id.txt_hello);
}
}

위와 같이 View를 호출 했었습니다.

이전 ButterKnife 라이브러리를 이용하면 저런 수고를 덜 수 있는데, 저 같은 경우 버그가 제법 발생 해서 사용 안했었거든요.


그럼 DataBinding을 하면 어떻게 소스가 변하느냐.



import android.databinding.DataBindingUtil;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.gogorchg.nomorefindviewbyid.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
ActivityMainBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mBinding.txtHello.setText("바인딩 성공!");
}
}

DataBindgUtil 이라는 클래스에 레이아웃을 정의 해주고,

return 받은 ActivityMainBinding을 이용하기만 하면 됩니다.



## 그럼 DataBinding을 사용 하는 방법을 알려드리겠습니다. (아주 간단함)

아래와 같이 app/build.gradle 에 추가해주세요.


android {
...

dataBinding {
enabled = true
}
}


그리고  res/layout/activity_main.xml 에 <layout ></layout>으로 감싸주시면 됩니다. 

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.gogorchg.nomorefindviewbyid.MainActivity">

<TextView
android:id="@+id/txt_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
</layout>


끝 입니다. 


자 Sync를 다시 받으시거나 clean build를 하신 후 위와 같이 하시면 됩니다.


그럼 ActivityMainBinding 클래스는 어떻게 만들고! txtHello 는 어떻게 정의 하나요???


라는 질문이 무조건 들어와야 합니다. ㅎ (저도 그랬으니깐요)


답은 자동입니다!!!


ActivityMainBinding 클래스는 제가 xml 이름을 activity_main 으로 정의 했기 때문에 저런 식으로 만들어 진겁니다.

'_'를 중심으로 뒤쪽 문자가 대문자가 되는 것이죠.


activity_love.xml 일 경우는 ActivityLoveBinding 이라는 클래스가 자동 생성 되겠죠?


txtHello 도 마찬가지 입니다.

txt_hello 라가 id를 정의 하였기 때문에 txtHello가 되는 것이죠.


개발자 분들은 다른 셋팅은 신경 쓰지지 마시고 그냥 자동으로 만들어진 클래스를 사용하시면 됩니다.^^


## 혹시나 다 해도 클래스가 import 되지 않으시는 분들

1. 'Build -> Rebuild Project' 를 해보세요.

2. 'Sync Project with Gradle Files' 버튼을 눌러 보세요.



3. 그래도 안될 경우, 

  'Build -> Make Project' 를 해보세요.


그럼 될껍니다.^^


그럼 참고하세요.