findViewById()
를 사용하면서 지저분하기도 하고, 더 쉽게 사용할 방법이 없을까 하면서 검색하다 보니 Data Binding
이 있었다. findViewById()
는 호출될 때마다 레이아웃 파일 트리를 순회하면서 찾기 때문에 비효율적이란 것을 처음 알게 되었다.
Data Binding
은 레이아웃 파일을 중개해주는 오브젝트를 만들어 관리한다. 액티비티 입장에서는 해당 오브젝트의 속성에 접근하듯 사용이 가능하다. ex) binding.buttonid
android {
...
buildFeatures {
dataBinding true
}
}
Data Binding
을 사용하기 위해 build.gradle
파일에 위와 같이 추가해서 기능을 활성화한다.
아래 코드와 같이 레이아웃 파일의 내용을 <layout>
태그로 감싸준다. xml name space는 최상단 layout태그 쪽으로 움겨준다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:backgroundTint="@color/white"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button" />
</LinearLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:backgroundTint="@color/y_in_mn_blue"
android:clickable="true"
android:contentDescription="@string/add"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@android:drawable/ic_input_add" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
위 과정이 완료되면 레이아웃 파일의 이름에 다라 자동으로 데이터를 중개해주는 클래스가 생성된다. 예를 들어 activity_main.xml
의 레이아웃 파일이 있다면 ActivityMainBinding
과 같은 자료형이 생성된다.
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.floatingActionButton.setColorFilter(ContextCompat.getColor(this,R.color.white));
}
}
제목은 viewBinding인데 내용은 dataBinding이네요.