View Binding: Kotlin Synthetic과 작별
4326 단어 android
Kotlin Synthetic은 내가 Kotlin을 사용하기 시작했을 때 가장 멋진 기능 중 하나였습니다. Android Java 환경에서 보기를 유지하려면
findViewById()
를 사용한 다음 적절한 보기 유형으로 캐스트해야 했습니다. 이것은 새로운 보기/화면을 생성할 때 가장 반복적이고 지루한 작업 중 하나였습니다.그런 다음 Kotlin과 합성이 등장했습니다. id가
hello
인 보기가 있는 경우 hello
를 작성하고 액세스할 수 있습니다. 상용구 없음, 아니오 findViewById
, 클래스에 있는 천 개의 멤버 변수가 아닙니다.그러나 그 개념이 너무 느슨하다는 것이 밝혀졌습니다. 그들은 전역 이름 공간을 가지고 있었고 null 허용 여부 검사가 없었습니다. 즉, 화면 1에 있더라도 화면 2에서
hello2
에 액세스할 수 있어 불가피한 충돌이 발생했습니다.따라서 한 걸음 뒤로 물러나는 것이 아마도 올바른 균형일 것입니다. Kotlin Android extensions (Kotlin Synthetic이 포함된)은 더 이상 사용되지 않으며 대체하는 권장 방법은 View Bindings 입니다. 이것은 상용구가 조금 더 많지만 유형 및 null 가능성 안전성을 제공합니다.
설정
Android
의 build.gradle
섹션에 다음을 추가합니다.android {
[...]
buildFeatures {
viewBinding true
}
}
자동 생성
이제
Build
-> Make project
를 수행하면 해당 바인딩 클래스가 있는 모든 XML 파일에 대해 생성됩니다. 예를 들어 fragment_screen_1.xml
의 경우 FragmentScreen1Binding
가 생성됩니다. 이러한 클래스에는 XML 레이아웃의 모든 하위 보기에 대한 멤버 변수가 포함되어 있습니다.팁: Android Studio에서 생성된 클래스를 인식하도록 하려면
File
-> Sync Project with Gradle files
를 수행해야 할 수 있습니다.바인딩 만들기
프래그먼트에서
private var binding: FragmentScreen1Binding? = null // 2.
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentScreen1Binding.inflate(inflater, container, false) // 1.
return binding.root // 3.
}
override fun onDestroyView() {
super.onDestroyView()
binding = null // 4.
}
inflate()
대신 자동 생성 클래스를 사용하여 뷰를 확장합니다. binding
는 onCreateView()
와 onDestroyView()
사이에서만 null이 아닙니다. fragment_screen_1.xml
레이아웃의 루트 보기입니다. binding
합니다. 활동 중
private lateinit var binding: FragmentScreen1Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = FragmentScreen1Binding.inflate(layoutInflater)
setContentView(binding.root)
}
부풀려진 보기가 활동 수명 주기와 밀접하게 연결되어 있으므로 정리할 필요가 없는 조각과 유사합니다.
바인딩 사용
XML 레이아웃의 모든 하위 보기에 대해
binding
변수에 카멜 케이스로 된 동일한 이름을 가진 멤버 변수가 있습니다. ID가 없는 보기는 액세스할 수 없습니다.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/hello_world"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
fragment_screen_1.xml
binding.helloWorld.text = "Hello world!"
FragmentScreen1.kt
Kotlin Synthetic을 사용하고 있는 경우
kotlinx.android.synthetic.*
에 대한 가져오기를 제거하고 해당 데이터 바인딩으로 바꿉니다.자세한 내용은 official doc (및 Kotlin Synthetic migration guide )을 확인하십시오. Android Views가 마음에 들지 않으시면 안정될 때까지 조금만 더 참으세요 :) 그때까지 즐거운 코딩 하세요!
Reference
이 문제에 관하여(View Binding: Kotlin Synthetic과 작별), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rockandnull/view-binding-farewell-to-kotlin-syntetic-2feg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)