뷰 바인딩을 사용하면 뷰와 상호 작용하는 코드를 더 쉽게 작성할 수 있습니다. Android Gradle 프로젝트에서 이를 설정하는 방법은 다음과 같습니다.
대부분의 Android 개발자는 아마도 클래식에 익숙할 것입니다. findViewById()
방법. XML 레이아웃에 있는 뷰 중 하나의 ID를 전달하면 해당 뷰의 확장된 버전에 대한 참조가 반환됩니다. 하지만 올바른 ID를 전달했고 뷰가 실제로 존재한다고 가정합니다. findViewById()
검색할 수 없는 뷰를 검색하는 것을 방지하기 위한 검사가 내장되어 있지 않습니다. 뷰 바인딩을 입력합니다.
사용하는 대신 findViewById()
원하는 각 뷰에서 뷰 바인딩은 각 레이아웃 XML에 대한 바인딩 클래스를 자동으로 생성합니다. ID가 있는 각 뷰는 자동으로 클래스에 추가되므로 직접 참조할 수 있습니다.
Android Gradle 프로젝트에 뷰 바인딩을 추가하는 것은 매우 간단합니다.
Gradle 설정
뷰 바인딩은 Gradle의 모듈 수준에서 활성화됩니다. 모듈이 여러 개인 경우 각 모듈에 대해 개별적으로 활성화해야 합니다.
에서 android
모듈 수준에서 차단 build.gradle
에서 뷰 바인딩을 활성화하는 옵션을 추가하세요.
android {
...
buildFeatures {
viewBinding true
}
}
불법 액세스에 대한 경고가 표시될 수 있지만 이는 보풀이 있는 버그이므로 무시해도 됩니다.
프로젝트를 동기화하면 뷰 바인딩이 활성화됩니다. 그렇게 쉽습니다.
뷰 바인딩 사용
뷰 바인딩을 사용하는 방법에는 몇 가지가 있지만 그 전에 바인딩 클래스가 생성되는 방법에 대해 이야기해 보겠습니다.
클래스 이름 구문
이름이 지정된 레이아웃 XML이 있다고 가정해 보겠습니다. some_layout.xml
. 해당 바인딩 클래스의 이름이 지정됩니다. SomeLayoutBinding
. 해당 패턴은 모든 파일에 적용됩니다.
파일 이름에서 밑줄로 구분된 각 단어는 대문자로 표시되며 밑줄은 제거됩니다. 그런 다음 "바인딩"이 끝에 추가됩니다.
기존 뷰로 인스턴스화
레이아웃 파일을 이미 확장했고 레이아웃 루트에 대한 참조가 있는 경우 뷰 바인딩 클래스에 기존 레이아웃을 사용하도록 지시할 수 있습니다.
코틀린:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
자바:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
예를 들어 Fragment에서 바인딩 클래스를 사용하려는 경우 다음과 같습니다.
코틀린:
classSomeFragment : Fragment(R.layout.some_layout) {
//Lazy initialization means bind() won't be called until "binding" is referenced.
private val binding by lazy { SomeLayoutBinding.bind(view) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)
//Once this method is called, you can start using the binding.
}
}
자바:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;publicSomeFragment(){
super(R.layout.some_layout);
}
@Override
publicvoidonViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
//Initialize the binding.
binding = SomeLayoutBinding.bind(view);
}
}
새 보기로 인스턴스화
바인딩 클래스는 레이아웃 확장을 처리할 수도 있습니다.
코틀린:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
자바:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
이 방법은 프래그먼트와 활동 모두에 유용합니다.
안 예제 조각 다음과 같이 보일 것입니다.
코틀린:
classSomeFragment : Fragment() {
private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?){
//The "root" of the binding class is the root of its layout.
return binding.root
}
}
자바:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;
@Override
publicvoidonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//Initialize the binding.
binding = SomeLayoutBinding.inflate(inflater);
//The "getRoot()" method of the binding class returns the root of the layout.
return binding.getRoot();
}
}
안 예시 활동 다음과 같이 보일 것입니다.
코틀린:
classSomeActivity : AppCompatActivity() {
private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.root)
}
}
자바:
publicclassSomeActivityextendsAppCompatActivity{
private SomeLayoutBinding binding = null;@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Instantiate the binding.
binding = SomeLayoutBinding.inflate(getLayoutInflater());
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.getRoot());
}
}
뷰 참조
이제 뷰 바인딩 클래스가 설정되고 사용할 준비가 되었으므로 실제로 사용할 차례입니다.
내용을 말하자면 some_layout.xml
다음과 같은 것입니다 :
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
코드에서 참조할 ID가 많이 있습니다. 그러나 바인딩 클래스를 인스턴스화하면 참조가 쉬워집니다.
Kotlin에서 뷰는 ID와 일치하는 변수로 참조되며 몇 가지 변경 사항이 있습니다. 밑줄이 제거되고 결과 문자열은 카멜 케이스로 표시됩니다. 예를 들어 참고로 some_frame_layout
코드에서 binding.someFrameLayout
. 그만큼 someFrameLayout
변수는 FrameLayout의 인스턴스가 됩니다.
val someFrameLayout: FrameLayout = binding.someFrameLayout
Java에서 뷰는 Kotlin과 유사한 형식으로 해당 ID와 일치하는 getter 메서드에 의해 참조됩니다. 예를 들어 참고로 some_frame_layout
, 당신은 사용할 것입니다 binding.getSomeFrameLayout()
. 이 메서드는 FrameLayout의 인스턴스를 반환합니다.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
뷰 참조도 바인딩에서 평면화됩니다. 참조 inner_imageview
참조하는 것과 동일합니다 some_frame_layout
.
결론
보시다시피 Android의 뷰 바인딩은 구현하기 쉽고 사용하기도 쉽습니다. 대부분의 경우에 비해 사용하기가 더 쉽습니다. findViewById()
.
몇 가지 예와 함께 뷰 바인딩 구현에 대한 자세한 내용은 다음을 참조하세요. Google의 공식 문서를 확인하세요..