ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android ViewBinding으로 FindViewByid 랑 작별하기
    Android 2021. 9. 25. 17:52
    test

    1 서론


    1.1 FindViewByid


    안드로이드에서 Layout에 존재하는 컴포넌트를 객체로 사용하려면
    FindViewByid를 통하여 작업을 했어야 했다.

    만약 접근하려는 컴포넌트가 5개, 10개만 넘어도
    class 파일에는 FindViewByid 가 많이 붙게 되는 걸 볼 수 있다.
    또한 개발자의 실수로 인해 잘못된 컴포넌트를 참조하려 하면 null이 발생하는 문제가 있다.

    예전에 Kotlin에서는 kotilin-android-extensions 을 통해 FindViewByid 없이도 컴포넌트에 접근하여 사용할 수 있는 게 큰 매력으로 다가왔지만
    이제는 여러 문제점으로 인해 kotilin-android-extensions를 기본으로 제공하지 않는다.
    따라서 이제는 ViewBinding를 사용하도록 권장하고 있다.

    1.2 ViewBinding


    build.gradle에 viewBinding 속성을 활성화시키는 것으로 사용할 수 있으며
    해당 모듈에 있는 layout 파일에 대한 binding class 가 자동으로 생성된다.

    이렇게 생성된 binding class를 통해 해당 layout에 있는 모든 컴포넌트에 참조가 가능해진다.
    즉 FindViewByid를 대체할 수 있게 된다.

    2 ViewBinding 사용하기


    2.1 ViewBinding 활성화

     

    android {
        buildFeatures {
            viewBinding true
        }
    }

    이렇게 설정하는 것으로 Layout 파일에 대한 binding class 파일이 자동으로 생성되며
    카멜 표기법으로 변환되고 이름 끝에 binding를 붙인 이름으로 생성된다.

    activity_main.xml -> ActivityMainBinding로 생성된다.

    2.2 Layout에 컴포넌트 배치

    <LinearLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:textSize="15sp"/>
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="버튼1"
            />
    
    </LinearLayout>

    간단하게 TextView, Button 을 하나씩 배치하였다.

    2.3 Activity Class 파일 수정

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
        }
    }

    기본적으로 만들어진 Class는 위와 같은 모양을 하고 있다.
    이제 이곳에 ViewBinding를 연결하면 된다.

    class MainActivity : AppCompatActivity() {
    
        private lateinit var binding : ActivityMainBinding
    	
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    	}
    }

    기존에 setContentView로 연결되어 있는 Layout이 아닌
    Binding Class의 인스턴스를 얻기 위해 inflate()를 사용하여
    rootView를 매개변수로 넣어주는 것으로 View를 참조할 수 있게 된다.

    2.4 컴포넌트 접근

    class MainActivity : AppCompatActivity() {
        private lateinit var binding : ActivityMainBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
    
            binding.btn.setOnClickListener{
                binding.tv.text="클릭";
            }
    	}
    }

     

    'Android' 카테고리의 다른 글

    Clean Architecture for Android  (0) 2023.01.14
    Hilt 사용  (0) 2022.09.05
    Android Coroutine 사용하기  (0) 2021.09.25
    Android Retrofit 사용하여 API 호출하기  (0) 2021.09.25
    Android Retrofit 인터셉터 사용하기  (0) 2021.09.25