findViewByid
이전 프로젝트#1에서 XML에 대해서 설명을 했는데 이번에는 이런 View를 코드 영역에 가져와 state, action에 대한 처리를 진행하고자 합니다.
android studio에서 지원해주는 xml design editor를 사용하게 되면 아래 이미지 처럼 View를 작업할 수 있는데요
안드로이드 초기 버전에서는 이런 뷰들을 가져올 때 findViewById를 사용했습니다.
findViewById란
위 이미지에서 보여지는 화면은 사용자에게 보여지는 레이아웃만을 설정했기 때문에 상태에 대한 변화나 이벤트를 처리하기 위해서는 .java, .kotlin 파일에서 처리를 해줘야 합니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_login) // 사용하고자 하는 layout을 연결해주는 코드
val button: Button = findViewById<Button>(R.id.button1) // xml View의 id
}
setContentView()는 현재 사용중인 Activity 혹은 Fragment를 입력되는 파라미터로 xml 파일과 연결시켜주는데 사용되는
메서드 입니다.
위 버튼처럼 변수를 생성하면 button의 setOnClickListener(콜백함수, swift는 클로저)를 사용할 수 있습니다.
val button: Button = findViewById<Button>(R.id.button1)
button.setOnClickListener {
// 버튼 클릭시 동작 코드 작성
}
findViewById의 단점
뷰에 대한 객체를 생성해야 될때 마다 코드의 라인수가 길어짐 → 화면에 보여져야 하는뷰(자식뷰)들의 숫자가 많아질수록 코드는 복잡 해집니다.
ViewBinding
위 findViewById의 문제점을 해결하기 위해서 나오게 된것이 ViewBinding인데 3.6version 이후부터 지원하게 되었다.
viewBinding을 사용하면 위의 findViewById를 작성하는 것과 같은 방법은 사용하지 않아도 됩니다.
왜 why? → 자동으로 클래스 파일을 생성해주기 때문 입니다.
뷰 바인딩을 하는 모든 클래스(액티비티, 프래그먼트)에서 자동으로 클래스 파일을 생성하여 xml 파일의 자식 뷰와 연결해주는
작업을 하게 됩니다.
이렇게 된다면 아래와 같이 간단한 방법으로 사용할 수 있어요.
view Binding으로 자식 뷰를 자동 생성으로 골라 쉽게 사용할 수 있습니다.
ViewBinding 사용법
그럼 이제 어떻게 ViewBinding을 사용하는지 설명 드릴게요
Grandle 설정
// 안드로이드 스튜디오 4.0 이상
android {
...
buildFeatures {
viewBinding = true
}
}
// 안드로이드 스튜디오 3.6 ~ 4.0
android {
...
viewBinding {
enabled true
}
}
사용하는 안드로이드 스튜디오 버전에 따라 달리 설정해주면 됩니다.
또한 Activity와 Fragment에서 뷰 바인딩 객체를 생성해줘야 합니다.
Activity의 경우
// MainActivitiy
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
Fragment의 경우
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentSettingBinding.inflate(inflater, container, false)
return binding.root
}
위 방식대로 설정하게 되면 아까 설명한 것처럼 binding. 으로 자식 뷰에 접근이 가능하게 됩니다.
질문? 왜 Activity와 Fragment는 xml을 적용하는 것과 자식뷰를 포함하는것이 동일한데 View Binding 방법이 다른가요?
이것에 대한 답변은 아래 링크를 확인 해주시면 됩니다. (잘 설명되어 있음)
[Android] View Binding, Activity에서와 Fragment에서 왜 구현 방법이 다를까?
간단히 요약하자면 Activity와 Fragment의 생명주기가 다른 것이 이유이다.
'AOS' 카테고리의 다른 글
[AOS] 사이드 프로젝트 (dogdom #1) (0) | 2024.03.24 |
---|---|
[AOS] 사이드 프로젝트 (dogdom #0) (0) | 2024.03.24 |