개발 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
}
}
dataBinding {
enabled = true
}
}
요렇게 dataBidning{ enabled =true } 코드만 추가해주시면 기본적으로 데이터 바인딩의 세팅이 되었습니다.
다음으로 xml코드
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.recyclerview.widget.RecyclerView
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의 간단한 소개였습니다.
안드로이드 초보 개발자를 위해 아래와 같은 카카오 오픈톡을 운영 중입니다.