만약 어떤 버튼을 비활성화 시키고 싶다면 어떻게 하면 좋을까?
버튼의 뷰는 layout(xml 파일)에 있고 비활성화 기능은 액티비티(Kotlin 또는 Java 파일)에 정의할 것이다.
여기서 처음 봉착하는 문제는 어떻게 뷰를 액티비티로 가져올 것인가? 일 것이다.
가장 단순한 방법으로는 findViewById를 이용해 버튼을 생성할 때 정의한 id로 버튼을 불러오는 것이다.
class MainActivity : AppCompatActivity() {
//중략
buttonView = findViewById(R.id.button)
}
현재는 버튼 하나를 가져와서 간단해 보이지만 만약 필요한 버튼이 100개라면 어떨까?
그럼 위의 findViewById를 이용해서 100개의 버튼을 일일이 가져와야 할 것이다.
이런 슬픈 코딩을 해야 하는 안드로이드 개발자를 가엽게 여긴 건지 3.6 버전 이후에는 이를 대체할 수 있는 view binding이 나오게 된다.
view binding을 사용하면 뷰 하나하나를 직접 가져오는 이러한 작업 없이 한 번에 모든 뷰가 들어있는 binding object를 생성해준다.
android {
buildFeatures {
viewBinding = true
}
}
android {
viewBinding {
enabled = true
}
}
class MainActivity : AppCompatActivity() {
//XXXActivity의 Binding Class 이름은 ActivityXXXBinding
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 버튼 비활성화, 여기서 button은 버튼의 id이다
binding.button.isEnabled = false
}
}
class HomeFragment : Fragment() {
//XXXFragment의 Binding Class 이름은 FragmentXXXBinding
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 버튼 비활성화, 여기서 button은 버튼의 id이다
binding.button.isEnabled = false
}
}