Android Gradle 프로젝트에 뷰 바인딩을 추가하는 방법

click fraud protection

뷰 바인딩을 사용하면 뷰와 상호 작용하는 코드를 더 쉽게 작성할 수 있습니다. 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의 공식 문서를 확인하세요..