Kotlin

안드로이드 뷰 바인딩(view binding)

여덟비트 2022. 2. 9. 00:23

뷰 바인딩

 

사용법

 

gradle 추가

// 안드로이드 스튜디오 4.0 이상
android {
    ...
    buildFeatures {
        viewBinding true
    }
}


// 안드로이드 스튜디오 3.6 ~ 4.0
android {
    ...
    viewBinding {
        enabled true
    }
}

 

액티비티

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

바인딩 클래스 이름은 규칙이 정해져있다.

Activity 이름 Binding Class 이름
MainActivity ActivityMainBinding
XXXActivity ActivityXXXBinding

프래그먼트

class FragmentTest : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // 1. 뷰 바인딩 설정
        val binding = FragmentMenuBinding.inflate(inflater, container, false)
        
        // 2. 바인딩으로 TextView 등에 접근
        bindig.myTextView.text = "바인딩이 잘 되었어요!!"

        // 3. 프래그먼트 레이아웃 뷰 반환
        return binding.root
    }
}

framgent_menu.xml 파일을 바인딩하려면, FragmentMenuBinding 클래스의 inflate()메서드를 호출해주면 된다.

(xml파일명의 첫글자와 언더바_ 다음 글자를 대문자로 바꾸고 Binding을 붙여주면 된다.)

 val binding = FragmentMenuBinding.inflate(inflater, container, false) 

 

프래그먼트는 뷰보다 더 오래 살아남음

바인딩 클래스는 뷰에 대한 참조를 가지고 있는데 뷰가 제거될 때(=onDestroyView) 이 바인딩 클래스의 인스턴스도 같이 정리해주는 것

 

역사

 

public class MainActivity extends AppCompatActivity {
 
    private TextView nameView, phoneView, addressView; // 변수 선언
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        nameView = findViewById(R.id.name); // findViewById로 id를 찾아서 넣어준다.
        phoneView = findViewById(R.id.phone);
        addressView = findViewById(R.id.address);
    }
}

예전에는 액티비티에서 뷰의 값을 변경하거나 뭔가 작업을 하려면

변수를 선언하고 findViewById를 이용해서 xml의 뷰와 변수를 연결시켜주는 작업을 해야 했다.

덕분에 코드가 항상 길어지고 더러워졌다.

view binding은 이 findViewById를 대체할 수 있는 기능이다.

3.5 버전까지는 개발자들이 findViewById를 사용했었다.

Butter knife라는 라이브러리나 extension을 이용해서 불편함을 해결했다고 한다.

 

그러다가 3.6 버전에서 이를 대체할 수 있는 view binding이 나오게 된다.

코틀린에서는 이 뷰 바인딩 작업조차 안 하고

id를 바로 변수처럼 사용할 수 있는 Kotlin Synthetic이 생겼다.

 

하지만 다음과 같은 문제가 있어 4.1 버전에서 Kotlin Synthetic은 deprecated 되었다.

  • 전역 네임 스페이스가 오염된다.
  • 개발자가 실수로 다른 레이아웃의 동일한 id를 가진 뷰를 가져오면서 NullPointException이 발생할 가능성이 있다.
  • Kotlin만 지원이 가능하다.

현재는 자바와 코틀린 둘 다 view binding을 사용한다.

findViewById도 사용할 수 있지만, 속도도 느리고 안전하지 못하다.

'Kotlin' 카테고리의 다른 글

안드로이드 뷰(Android View)  (0) 2022.02.09