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 가능성 안전성을 제공합니다.

설정


Androidbuild.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() 대신 자동 생성 클래스를 사용하여 뷰를 확장합니다.
  • bindingonCreateView()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가 마음에 들지 않으시면 안정될 때까지 조금만 더 참으세요 :) 그때까지 즐거운 코딩 하세요!

    좋은 웹페이지 즐겨찾기