[Android] ViewBinding

김민주·2022년 10월 14일
0

Android

목록 보기
3/21

kotlin-android-extensions을 사용하면

👍 findViewById함수 생략가능
👎 여러 xml에서 id동일할 경우 코드가 헷갈려짐

그래서 4.1부터 지원중단하고 뷰 바인딩 사용하도록 발표 !!




ViewBinding

  • 각각 xml 마다 ViewBinding 클래스 상속 받는 개별 뷰 바인딩 클래스 자동생성
  • onCreate() 안에 뷰 바인딩 클래스 인스턴스 생성
  • 인스턴스가 id 프로퍼티로 제공

👍 1. Null-safe

여러 xml의 같은 id 구분 가능 (아니면 Nullable로 만듦)

👍 2. Type-safe

오탈자 방지

👍 3. Build Speed

빌드 속도가 빨라짐



build.gradle에서
id 'kotlin-android-extensions' 플러그인 시

view.findViewById<Button>(R.id.button1).setOnClickListener{}

처럼 find하지 않아도

button1.setOnClickListener{} 가 가능한데,


뷰들이 많아지면 어디서 import했는지 헷갈리기 때문에 바인딩을 쓰자~!!


Build.gradle

    buildFeatures {
        viewBinding true
    }

추가해주면 모든 xml파일에서 바인딩 클래스 생성


binding.button1.setOnClickListener{}

가 될 수 있음





💗 Fragment에서의 ViewBinding 사용


  private var _binding: FragmentFirstBinding? = null

    private val binding get() = _binding!!

옵셔널형태의 바인딩을 만들어주고

실 사용할 옵셔널 벗긴 바인딩을 하나 더 만들어서 쓰자


WHY?


override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

뷰바인딩 할 때 Fragment를 사용하지 않을 때 자원을 반환하게 하기위함


그리고

바인딩 게터함수에서 옵셔널을 벗기는 것은
뷰가 만들어지기 이전에 null이 되어 프래그먼트 뷰를 만들지 못하것을 막기 위함이다.




Basic Activity의 FirstFragment

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

        _binding = FragmentFirstBinding.inflate(inflater, container, false)
        return binding.root

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.buttonFirst.setOnClickListener {
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

onCreateView도 뷰의 버튼 접근도 바인등을 통해 해주자 ~

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글