[Android-studio] ViewBinding

델버·2022년 6월 1일
0

Android

목록 보기
2/5

ViewBinding

  • View를 불러올 때 findViewById보다 더 쉽게 작성할 수 있다, 즉 View와 상호작용하는 코드를 쉽게 작성할 수 있다.

  • 각 xml 파일에 대해 ViewBinding 클래스를 상속 받는 개별 ViewBinding 클래스를 생성한다.

  • ViewBinding의 인스턴스는 id를 가진 모든 View를 직접 참조할 수 있다. (View들을 property로 가짐)

  • 이전 kotlin extensions은 각기 다른 xml파일에서 같은 id를 사용할 수 있기 때문에 ViewBinding을 사용하는 것이 좋다.(android studio 4.1부터 지원 중단)
    https://developer.android.com/topic/libraries/view-binding/migration?hl=ko

장점

  • Null-safe : 직접 참조를 하기 때문에 Exception이 발생할 위험이 없고, 참조할 수 없으면 @Nullable로 표시된다.
  • Type-safe : View의 Type를 잘못 지정할 위험이 없다. ViewBinding 클래스에 있는 Type과 xml에서 참조하는 View와 일치하기 때문이다.

예시 (Activity)

  1. gradle에 ViewBinding 활성화를 한다. sync를 하면 자동으로 개별 ViewBinding이 생성된다.
viewBinding {
        enabled = true
}

  1. xml 파일에 TextView와 Button을 넣어주고 id를 넣는다.

  1. MainActivity에 binding를 넣어준다.
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
		// 생성된 ViewBinding 클래스의 이름은 xml파일의 이름을 '카멜 표기법'을 변환하여 Binding이 뒤에 추가 된다.

	  // ex) activity_main.xml -> ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
				// Binding 클래스의 인스턴스가 이때 생성된다.

        setContentView(binding.root)
				// root View를 가져와서 활성 뷰로 만든다.

        binding.btnMain.setOnClickListener {
						Toast.makeText( applicationContext , "gogo", Toast.LENGTH_SHORT).show()
            binding.tvMain.text = "gogo"
        }
				// ActivityMainBinding 내에 property로 들어간 View들을 
				//binding.id로 가져올 수 있다.
        
    }
}

예시 (Fragment)

  • Activity 예시의 2번까지는 같다.
class FirstFragment : Fragment() {

    private var _binding : FragmentFirstBinding? = null
    private val binding get() = _binding!!

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

//        return inflater.inflate(R.layout.fragment_first,container,false)
        _binding = FragmentFirstBinding.inflate(inflater,container,false)
        // binding 클래스의 인스턴스 생성
        return binding.root
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.btnFirstFragment.setOnClickListener {
            Toast.makeText( activity , "gogo", Toast.LENGTH_SHORT).show()
            // fragment의 경우 context를 갖고있지 않아서
            // context를 kotlin에서 activity로 가져온다. - 자바의 경우엔 getActivity()
            binding.tvFirstFragment.text = "gogo"
        }
    }
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
        // onDestroyView 이훼 fragment의 View는 끝나지만 fragment는 여전히 살아있기 때문에
        // null로 만들어 줘야한다.

    }
}

참고

0개의 댓글