ViewBinding
решил самую большую проблему kotlinx.android.synthetic
. В привязке synthetic
, если вы задаете представление содержимого для макета, а затем введите идентификатор, который существует только в другом макете, среда IDE позволяет выполнять автозаполнение и добавлять новый оператор импорта. Если разработчик не проверит, чтобы убедиться, что его операторы импорта импортируют только правильные представления, нет безопасного способа убедиться, что это не вызовет проблем во время выполнения. Но в ViewBinding
вы должны использовать объект привязки layout
для доступа к его представлениям, чтобы вы никогда не вызывали представление в другом макете, и если вы захотите это сделать, вы получите ошибку компиляции, а не ошибку времени выполнения. Вот пример.
Мы создаем два макета с именами activity_main
и activity_other
примерно так:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/message_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
activity_other.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/message_other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
Теперь, если вы напишите свою активность следующим образом:
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_other.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Application will crash because "message_other" doesn't exist in "activity_main"
message_other.text = "Hello!"
}
}
, ваш код скомпилируется без ошибок, но ваше приложение будет аварийно завершать работу во время выполнения. ,Поскольку представление с message_other
id не существует в activity_main
, и компилятор не проверял это. Но если вы используете ViewBinding
следующим образом:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//This code will never compile and the IDE shows you an error
binding.message_other.text = "Hello!"
}
}
, ваш код никогда не скомпилируется, а Android Studio
покажет вам ошибку в последней строке.