viewBinding

 

findViewById을 대체하기 위한 것

 

뷰와 상호작용하는 코드를 쉽게 작성할 수 있으며

바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰의 직접 참조

 

대부분의 경우 viewBinding이 findViewById를 대체합니다.

 

 

findViewById란?

[layout] .xml 파일에서 지정한 id를 .kt에서 다룰 수 있게 참조하는 것

 

 

findViewById 단점

id와 view가 많아지게 되면 id value가 중복이 가능하지만 구별하기 힘들다.

 

 

viewbinding 장점

1. Null safety - 뷰의 직접 참조를 생성하여 View ID로 인해 null pointer exception 발생 위험이 없다

2. Type safety - .XML파일에 참조하는 뷰와 일치하여 return type error가 없다.

3. binding을 하는 순간 해당 view의 모든 id를 참조할 수 있다 (시간절약)

 

 

build.gradle (Module : .app)

android {
   //android 블럭 내부에 추가
    viewBinding {
        enabled = true
    }
 

 

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:gravity="center"
    >

    <TextView
        android:text="this text will be change"
        android:id="@+id/txtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <EditText
        android:id="@+id/editTxt"
        android:layout_width="300dp"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btn"
        android:textAllCaps="false"
        android:text="Click Here"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

//입력할 텍스트, 바뀌는 텍스트, 버튼 추가

</LinearLayout>
 

 

 

 

MainActivity.kt (findViewById)

package com.example.test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView

class MainActivity : AppCompatActivity() {

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

        //Resource에 존재하는 id 중 각각 입력한 id를 찾는다 
        val txt : TextView = findViewById(R.id.txtView)
        val editText : EditText = findViewById(R.id.editTxt)
        val btn : Button = findViewById(R.id.btn)
       
        //버튼을 클릭 했을 시 editText에 입력한 값이 txt에 대입된다.
        btn.setOnClickListener {
            txt.text = editText.text.toString()
        }
    }
}

 

Elegance, Compile Time Safety, Build Speed Impact

(깔끔하게), (컴파일 시 보안), (빌드 속도 영향)

전부 만족하지 않으며 .xml view가 추가 될 때마다 직접 입력해야 하는 불편함이 있다

 

 

MainActivity.kt (ViewBinding)

package com.example.test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.test.databinding.ActivityMainBinding
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    //카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성
    //binding의 규칙 xml명 : activity_main → ActivityMainBinding
    //만약 xml명이 result_profile이라면 → ResultProfileBinding

    //binding 변수 생성
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
       //현재 Ui 저장
        super.onCreate(savedInstanceState)
       
        //inflate 메소드가 액티비티에서 사용할 바인딩 클래스의 인스턴스 생성
        //inflate 메소드 호출 하면 사용할 인스턴스가 생성
        binding = ActivityMainBinding.inflate(layoutInflater)

        //최상단인 root와 연결하여 출력
        setContentView(binding.root)

        //AcitvityMainBinding이 xml 파일 내에 저장되어 있는 id를 찾는다
        binding.btn.setOnClickListener {
            txtView.text = editTxt.text.toString()
        }
    }
}
 

 

 

요약

findViewById - view 추가시 마다 참조

ViewBinding - binding 자체가 스스로 찾아줌

카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성

binding의 규칙 xml명 : activity_main → ActivityMainBinding

만약 xml명이 result_profile이라면 → ResultProfileBinding

 

binding 변수 생성해주기

private lateinit var binding : ActivityMainBinding
 

메서드 생성해주기

        binding = ActivityMainBinding.inflate(layoutInflater)
 

​ContentView 변경하기

setContentView(binding.root)
 

 

 

 

 

 

https://developer.android.com/topic/libraries/view-binding?hl=ko

 

복사했습니다!