ViewBinding
rozwiązał największy problem kotlinx.android.synthetic
. W synthetic
wiążący, jeśli w Treści do układu, a następnie wpisz identyfikator, który istnieje tylko w innym układzie, IDE pozwala uzupełni i dodać nową instrukcję import. O ile programista nie sprawdzi, czy wyciągi importowe importują tylko prawidłowe widoki, nie ma bezpiecznego sposobu na sprawdzenie, czy nie spowoduje to problemów z czasem wykonywania. Ale w obiekcie ViewBinding
powinieneś użyć layout
obiektu wiązania, aby uzyskać dostęp do jego widoków, aby nigdy nie wywoływać widoku w innym układzie, a jeśli chcesz to zrobić, otrzymasz błąd kompilacji, a nie błąd wykonania. Oto przykład.
Tworzymy dwa układy zwane activity_main
i activity_other
tak:
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>
Teraz, jeśli napiszesz swoją aktywność w ten sposób:
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!"
}
}
kod zostanie skompilowany bez żadnego błędu, ale aplikacja ulegnie awarii w czasie wykonywania. Ponieważ widok o message_other
identyfikatorze nie istnieje, activity_main
a kompilator tego nie sprawdził. Ale jeśli używasz ViewBinding
tak:
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!"
}
}
Twój kod nigdy się nie skompiluje i Android Studio
wyświetli błąd w ostatniej linii.