- [Android] DataBinding 적용하기 - 012023년 09월 25일 21시 28분 57초에 업로드 된 글입니다.작성자: 핀수728x90반응형
DataBinding
프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원 라이브러리
안드로이드 개발자라면 많이들 알고 있는 데이터바인딩!
현재 개발하고 있는 WW는,
기존에는 ViewBinding을 통해서 UI를 업데이트하고 있었는데
이후 나머지 기능들을 개발하면서 DataBinding도 같이 써보면 좋겠다고 생각해 적용을 해보았다.
알다시피 기존의 UI 업데이트 방식은 findViewById 를 통해 view를 찾고, 거기에 맞는 데이터를 업데이트 하는 방식이었다.findViewById<TextView>(R.id.sample_text).apply { text = viewModel.userName }
내가 기존에 사용했던 ViewBinding은 findViewById가 하던 일을 대신 해주었다.
binding.sampleText.text = viewModel.username
DataBinding은 코드 단에서 UI를 업데이트하지 않고, 레이아웃에서 직접 데이터를 업데이트 할 수 있다.
<TextView android:text="@{viewmodel.userName}" />
DataBinding을 사용하면 위처럼 코드 단에서 view를 찾고, 업데이트하기 위한 코드들이 사라져
코드가 깔끔해지고 유지관리도 쉬워진다.
또한, findViewById 의 고질적인 문제인 NPE도 피할 수 있으며 (이건 ViewBinding 도 가지고 있는 이점이다.)
앱 성능이 향상되고 메모리 누수를 방지할 수 있다고 한다.적용하기
build.gradle(:app)
별다른 절차는 필요하지 않고...app 수준 build.gradle에서 사용 여부를 true로 지정해주면 된다.
android { ... buildFeatures { dataBinding true } }
xml
전체 레이아웃을 <layout></layout> 태그로 감싸준다.
그리고 namespace를 여기로 옮겨주면 된다.
그리고 기존 레이아웃 위에 다음과 같이 선언해준다.<data> <variable name="연결할 모델" type="모델 경로" /> </data>
그리고 UI 업데이트가 필요한 view에서 다음과 같이 사용할 수 있다.
<TextView android:id="@+id/detail_height_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{연결할모델.멤버변수}" android:textColor="@color/black_100" android:textSize="@dimen/textSize" />
Activity.kt
레이아웃 inflate와 바인딩 클래스를 얻기 위해 다음과 같이 작성해주면 된다.
binding = DataBindingUtil.setContentView(this, R.layout.activity_login)
@AndroidEntryPoint class LoginActivity : AppCompatActivity() { private lateinit var binding: ActivityLoginBinding private val viewModel: LoginViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_login) binding.viewModel = viewModel binding.lifecycleOwner = this } }
binding.viewModel = viewModel
위 구문은 데이터바인딩과 ViewModel 구성요소를 함께 사용하기 위한 것이다.
바인딩 클래스의 viewModel 속성에 viewModel을 할당해주면 된다.
binding.lifecycleOwner = this
바인딩 클래스를 인스턴스화한 후 수명주기를 현재 액티비티로 지정하는 것이다.
이런식으로 생명주기를 지정할 수 있어 메모리 누수를 방지할 수 있는 것으로 보인다.
♨ TroubleShooting: android.content.res.Resources$NotFoundException: String resource ID #0x0
데이터가 Int인 경우 마찬가지로 오류가 발생한다.
이때는android:text="@{Integer.toString(연결모델.멤버변수)}"
또는
android:text="@{String.valueOf(연결모델.멤버변수)}"
으로 String으로 변환해주면 된다.
데이터 바인딩이 어떤 것이고, 적용하는 방법에 대해 간략하게 알아보았다.
다음 글에서는 WW 프로젝트에서 DataBinding을 적용하면서 알게 된 것들을 작성해보고자 한다.
공부하며 작성된 글이라 잘못된 정보가 있을 수 있습니다.
말씀해주시면 수정하겠습니다. 감사합니다.References
아래 글을 참고하여 작성 되었습니다.
728x90반응형'Android > Android' 카테고리의 다른 글
[Android] DataBinding 적용하기 - 03 (0) 2023.09.27 [Android] DataBinding 적용하기 - 02 (0) 2023.09.26 [Android] BLE 통신 구현하기 (2) 2023.05.29 [Android] Unity 연동된 Android 프로젝트에서 Unity만 종료하기 (2) 2023.03.21 [Android] Unity와 Android 연동하기 | UnityPlayerActivity as subView (2) 2023.03.20 다음글이 없습니다.이전글이 없습니다.댓글