Domain/Android

[Android] DataBinding

by Donghwan 2020. 9. 21.
  • 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원 라이브러리입니다.
  • 레이아웃 파일에서 구성요소를 결합하면 활동에서 많은 UI 프레임워크 호출을 삭제할 수 있어 파일이 더욱 단순화되고 유지관리 또한 쉬워집니다. 앱 성능이 향상되며 메모리 누수 및 null 포인터 예외를 방지할 수 있습니다.
  • 데이터 변경을 쉽게 식별하기 위한 클래스 및 메서드를 제공합니다. 기본 데이터 소스가 변경될 때 UI 새로고침에 관해 신경쓰지 않아도 됩니다. 변수 또는 속성을 식별 가능하게 만들 수 있습니다. 라이브러리를 통해 객체, 필드 또는 컬렉션을 식별 가능하게 만들 수 있습니다.
  • 레이아웃의 변수 및 뷰에 액세스하는 데 사용되는 결합 클래스를 생성합니다. 이 페이지는 생성된 결합 클래스를 사용하고 맞춤설정하는 방법을 보여줍니다.
  • BindingAdapter를 사용하여 적절한 프레임워크를 호출하여 값을 설정하는 작업을 담당합니다.
  • UI 개발을 한층 단순화할 수 있습니다.
  • Two - Way DataBinding을 지원합니다. 이 결합 유형에 사용된 표기법은 속성의 데이터 변경사항을 받는 동시에 속성의 사용자 업데이트를 수신 대기하는 기능을 지원합니다.

 

App 수준 Build Gradle에 DataBinding 라이브러리 추가

android {
    ...
    dataBinding {
        enabled = true
    }
}

//Gradle 4.0.0 이상
android {
    ...
    buildFeatures {
        dataBinding true
    }
}

 

XML에서 DataBinding 사용 예시

<layout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto">
        <data>

        <import type="android.view.View" />

		        <variable
		            name="activity"
		            type="com.example.databinding_exam.activity.MainActivity" />
		
		        <variable
		            name="vm"
		            type="com.example.databinding_exam.activity.ActivityViewModel" />
		
		        <variable
		            name="user"
		            type="com.example.databinding_exam.model.User" />
	
		    </data>
        <ConstraintLayout... /> <!-- UI layout's root element -->
</layout>

 

Binding data

//for Activity
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //아래와 같이 두가지 방법이 사용가능하다.
        //binding = ActivityMainBinding.inflate(layoutInflater)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    }
}
//for Fragment,ListView,RecyclerView
class MainFragment : Fragment() {
    private lateinit var binding: FragmentMainBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
        return binding.root
    }
}

 

사용예시

//Activity에서 binding 변수에 data 할당
override fun onCreate() {
	binding.activity = this@Mainactivity
	binding.vm = ViewModel()
	binding.user = User("donghwan", 0)
}
//XML에서 onClick 사용 예시
<Button
	android:id="@+id/btn_one"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_weight="1"
	android:onClick='@{()->activity.buttonClick(user,1)}'
	android:text="age change 1" />

 

728x90
반응형

댓글