뷰 결합 Android Jetpack의 구성요소
뷰 결합은 상호작용하는 코드를 더 쉽게 작성할 수 있는 기능입니다. 있습니다. 모듈에서 사용 설정된 뷰 결합은 모듈의 바인딩을 생성함 클래스를 지정해야 합니다. 결합의 인스턴스 클래스는 표시됩니다.
대부분의 경우 뷰 결합이 findViewById
를 대체합니다.
설정
뷰 결합은 모듈별로 사용 설정됩니다. 다음에서 뷰 결합을 사용 설정하려면 다음 안내를 따르세요.
모듈의 경우 모듈 수준에서 viewBinding
빌드 옵션을 true
로 설정합니다.
build.gradle
파일을 엽니다.
Groovy
android { ... buildFeatures { viewBinding true } }
Kotlin
android { ... buildFeatures { viewBinding = true } }
결합 클래스를 생성하는 동안 레이아웃 파일을 무시하려면
해당 레이아웃의 루트 뷰에 tools:viewBindingIgnore="true"
속성을 추가합니다.
파일:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
사용
모듈에 뷰 결합이 사용 설정되면 모듈마다 결합 클래스가 생성됩니다. 모듈에 포함된 XML 레이아웃 파일입니다. 각 결합 클래스에 참조가 포함됨 루트 뷰와 ID가 있는 모든 뷰에 적용할 수 있습니다. 결합 클래스의 이름은 다음과 같습니다. XML 파일의 이름을 파스칼 표기법으로 변환하고 단어 "바인딩" 있습니다.
예를 들어 다음과 같은 레이아웃 파일 result_profile.xml
이 있다고 가정해 보겠습니다.
다음과 같습니다.
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
생성된 결합 클래스 이름은 ResultProfileBinding
이 됩니다. 이 클래스에는
필드: name
라는 TextView
와 button
라는 Button
입니다. 이
레이아웃의 ImageView
에는 ID가 없으므로
바인딩 클래스도 지원합니다.
모든 결합 클래스에는 getRoot()
메서드를 포함하여
참조해야 합니다. 이 예에서
ResultProfileBinding
클래스의 getRoot()
메서드는 다음을 반환합니다.
LinearLayout
루트 뷰
다음 섹션에서는 생성된 바인딩 클래스를 사용하는 방법을 보여줍니다. 사용할 수 있습니다.
활동에서 뷰 결합 사용
활동에 사용할 결합 클래스의 인스턴스를 설정하려면 다음을 수행합니다.
액티비티의
onCreate()
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다.
- 생성된 결합 클래스에 포함된 정적
inflate()
메서드를 호출합니다. 그러면 활동에서 사용할 결합 클래스 인스턴스가 생성됩니다. getRoot()
메서드를 호출하여 루트 뷰 참조를 가져옵니다. 사용하여 Kotlin 속성 구문을 참고하세요.- 루트 뷰를
setContentView()
드림 화면에 Active View가 표시됩니다.
이러한 단계는 다음 예에 나와 있습니다.
Kotlin
private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) val view = binding.root setContentView(view) }
자바
private ResultProfileBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ResultProfileBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); }
이제 결합 클래스 인스턴스를 사용하여 뷰를 참조할 수 있습니다.
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
자바
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
프래그먼트에서 뷰 결합 사용
프래그먼트에 사용할 결합 클래스의 인스턴스를 설정하려면 다음을 수행합니다.
프래그먼트의
onCreateView()
드림
메서드를 사용하여 축소하도록 요청합니다.
- 생성된 결합 클래스에 포함된 정적
inflate()
메서드를 호출합니다. 그러면 프래그먼트에서 사용할 결합 클래스 인스턴스가 생성됩니다. getRoot()
메서드를 호출하여 루트 뷰 참조를 가져옵니다. 사용하여 Kotlin 속성 구문을 참고하세요.onCreateView()
메서드에서 루트 뷰를 반환하여 Active View를 볼 수 있습니다.
Kotlin
private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = ResultProfileBinding.inflate(inflater, container, false) val view = binding.root return view } override fun onDestroyView() { super.onDestroyView() _binding = null }
자바
private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; }
이제 결합 클래스 인스턴스를 사용하여 뷰를 참조할 수 있습니다.
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
자바
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
다양한 구성에 관한 힌트 제공
여러 구성에서 뷰를 선언할 때 가끔 특정 레이아웃에 따라 다른 뷰 유형을 사용하는 것이 좋습니다. 다음 코드 스니펫에서 이러한 예를 보여줍니다.
# in res/layout/example.xml
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" />
이 경우 생성된 클래스가 userBio
필드를 노출한다고 예상할 수 있습니다.
TextView
가 공통 기본 클래스이기 때문에 TextView
유형입니다. 원인
기술적 제한이 있으면 뷰 결합 코드 생성기가 이를 확인할 수 없고
대신 View
필드를 생성합니다. 이를 위해서는 나중에
binding.userBio as TextView
이 제한을 해결하기 위해 뷰 결합은 tools:viewBindingType
를 지원합니다.
속성을 사용하여 생성된 코드에서 사용할 유형을 컴파일러에 알려줄 수 있습니다.
이전 예에서는 이 속성을 사용하여 컴파일러가
필드를 TextView
로 생성합니다.
# in res/layout/example.xml (unchanged)
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />
또 다른 예제에서 두 개의 레이아웃이 있다고 가정해 보겠습니다. 하나는
BottomNavigationView
와 NavigationRailView
가 포함된 다른 호출 모두
클래스는 대부분의 구현을 포함하는 NavigationBarView
를 확장합니다.
확인하세요. 코드가 클래스에 어떤 서브클래스가 있는지 정확히 알 필요가 없는 경우
tools:viewBindingType
를 사용하여 생성된
두 레이아웃에서 모두 NavigationBarView
로 입력합니다.
# in res/layout/navigation_example.xml
<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
# in res/layout-w720/navigation_example.xml
<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
코드를 생성할 때는 뷰 결합에서 이 속성 값의 유효성을 검사할 수 없습니다. 받는사람 컴파일 시간 및 런타임 오류를 방지하려면 값이 다음을 충족해야 합니다. 조건:
- 값은
android.view.View
에서 상속된 클래스여야 합니다. 값은 값이 배치되는 태그의 슈퍼클래스여야 합니다. 예를 들어 다음 값은 작동하지 않습니다.
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. --> <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
최종 유형은 모든 구성에서 일관되게 확인되어야 합니다.
findViewById와의 차이점
뷰 결합에는 findViewById
를 사용하는 것에 비해 다음과 같은 중요한 장점이 있습니다.
- Null 안전: 뷰 결합이 뷰를 직접 참조하므로
잘못된 뷰 ID로 인해 null 포인터 예외가 발생할 위험이 없습니다.
또한 뷰가
레이아웃에서 결합 클래스에 참조를 포함하는 필드가 표시됨
@Nullable
를 사용합니다. - 유형 안전성: 각 결합 클래스의 필드의 유형이 참조되는 뷰입니다. 즉, 클래스 자체를 실행할 위험이 없고 변환 예외가 발생합니다.
이러한 차이는 레이아웃과 코드 간의 비호환성을 의미합니다. 런타임이 아닌 컴파일 시간에 빌드가 실패합니다.
데이터 결합과 비교
뷰 결합과 데이터 결합은 모두 뷰를 직접 참조하는 데 사용할 수 있는 결합 클래스 그러나 바인딩은 더 간단한 사용 사례를 처리하기 위한 것이며 다음을 제공합니다. 다음과 같은 이점이 있습니다.
- 더 빠른 컴파일: 뷰 결합에는 주석 처리가 필요하지 않으므로 컴파일 시간이 빨라집니다
- 사용 편의성: 뷰 결합에는 특별히 태그가 지정된 XML 레이아웃이 필요하지 않습니다. 더 빠르게 채택할 수 있습니다. 다음에서 뷰 결합을 사용 설정하면 해당 모듈의 모든 레이아웃에 자동으로 적용됩니다.
반면에 뷰 결합에는 데이터에 비해 다음과 같은 제한사항이 있습니다. 바인딩:
- 뷰 결합이 레이아웃 변수 또는 레이아웃을 지원하지 않음 표현식에서 공유하므로 사용할 수 없습니다. XML 레이아웃 파일에서 바로 동적 UI 콘텐츠를 선언할 수 있습니다.
- 뷰 결합은 양방향 데이터를 지원하지 않음 바인딩을 사용하면 됩니다.
따라서 경우에 따라서는 두 가지 보기를 모두 사용하는 것이 가장 좋습니다. 데이터 결합입니다. 다음과 같은 레이아웃에서 데이터 결합을 사용할 수 있습니다. 고급 기능이 필요하며, 필요하지 않은 레이아웃에서는 뷰 결합을 사용해야 합니다.
추가 리소스
뷰 결합에 관한 자세한 내용은 다음 추가 리소스를 참고하세요.
샘플
블로그
동영상
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- Kotlin 합성에서 Jetpack 뷰 결합으로 이전
- 레이아웃 및 바인딩 수식
- 앱 아키텍처: UI 레이어 - 시작하기 - Android 개발자