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идентификатором не существует, 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покажет вам ошибку в последней строке.