핀수로그
  • [Android] DataBinding 적용하기 - 01
    2023년 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

    아래 글을 참고하여 작성 되었습니다.

     

    데이터 결합 라이브러리  |  Android 개발자  |  Android Developers

    컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선

    developer.android.com

     

    728x90
    반응형
    댓글