Kotlin으로 소스코드에서 레이아웃에 접근하려 할 때 처음엔 findViewById()로 뷰를 가져왔다.

 

공부를 하다보니 findViewById()는 코드의 가독성이 떨어지고 코드량이 불필요하게 많아져 좋은 수단은 아닌거 같다.

 

찾아보니 안드로이드 스튜디오 3.6 버전 부터 viewBinding이라는 비교적 편한 기능이 제공되고 있다.

 

findViewById는 val textView = findViewById<TextView>(R.id.TextView) 이런식으로 뷰들을 변수에 모두 선언해서 사용했지만 binding은 설정만해주면 binding.textview.text = "binding편하당" 이런식으로 바로 사용가능하다.

 

findViewById는 다른 모든 레이아웃들에도 접근하여 id체크를 하고 binding은 내가 사용하고자 하는 레이아웃만 연결시켜 사용하기에 속도면에서도 빠르다. 그 외 NullPointerException, CastException 문제에서 binding이 걱정이 없어 상위호환으로 볼 수 있다.

 

 

사용법을 보자.

 

우선, gradle 설정 먼저 해줘야 한다.

android {
    ... 
    buildFeatures {
        viewBinding = true
    }
}

build.gradle 의 안드로이드 코드 블럭에 위와 같이 viewBinding 사용을 선언한다. Sync Now 해주는거 잊지말자!

 

이렇게 뷰 바인딩을 선언해줌으로써 사용하는 액티비티, 프래그먼트 등의 xml 레이아웃 파일들을 모두 바인딩클래스로 자동변환 해준다.

예 )            activity_main.xml -------> ActivityMainBinding

                  fragment_list.xml -------> FragmentListBinding

                  item_recycler.xml -------> ItemRecyclerBinding

 

 

Activity에서 binding 사용

class MainActivity : AppCompatActivity() {
    // lazy 를 사용해서 처음 호출될 때 초기화 되도록 설정
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate() {
        super.onCreate()
        setContentView(binding.root) // * setContentView에는 binding.root를 꼭 전달
    }

 

액티비티에서는 by lazy를 사용해서 최초 호출시에 초기화 되도록 바인딩 프로퍼티를 선언하고 사용하고

setContentView에 binding.root를 전달해준다.

 

Fragment 에서 binding 사용

class ListFragment : Fragment() {
    // lateinit으로 binding을 선언
    lateinit var binding:FragmentListBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentListBinding.inflate(inflater, container,false)
        return binding.root
    }

 

프래그먼트는 액티비티와 다르게 LayoutInflater를 onCreateView에서 넘겨받기에 직접 초기화해주는게 낫다고 한다. 그래서 lateinit으로 한다.

Infalte란 xml에 있는 레이아웃들을 메모리에 객채화 시키는 행동 즉, 우리가 알고 싶은 요소들을 코드로 접근할 수 있게 해주는 것.

 

+ Recent posts