ViewBinding
вирішили найбільшу проблему Росії kotlinx.android.synthetic
. У synthetic
зв'язуванні , якщо ви встановите вид контент на макет, а потім введіть ідентифікатор , який існує тільки в іншому макеті, середовище дозволяє автозаповнення і додати новий оператор імпорту. Якщо розробник спеціально не перевіряє, чи впевнені, що їх заяви про імпорт лише імпортують правильні представлення даних, немає безпечного способу підтвердити, що це не спричинить проблеми з часом виконання. Але в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
показує вам помилку в останньому рядку.