ViewBindingresolveu o maior problema de kotlinx.android.synthetic. Na syntheticassociação, se você definir sua exibição de conteúdo como um layout e digitar um ID que exista apenas em um layout diferente, o IDE permitirá que você complete automaticamente e adicione a nova instrução de importação. A menos que o desenvolvedor verifique especificamente se as instruções de importação importam apenas as visualizações corretas, não há uma maneira segura de verificar se isso não causará um problema de tempo de execução. Mas ViewBindingvocê deve usar seulayout objeto de ligação para acessar suas visualizações, para nunca invocar uma visualização em um layout diferente e, se quiser fazer isso, receberá um erro de compilação e não um erro de tempo de execução. Aqui está um exemplo.
Criamos dois layouts chamados activity_maine activity_otherassim:
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>
Agora, se você escrever sua atividade assim:
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!"
}
}
seu código será compilado sem nenhum erro, mas seu aplicativo falhará em tempo de execução. Porque a visualização com message_otherid não existe activity_maine o compilador não verificou isso. Mas se você usar ViewBindingassim:
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!"
}
}
seu código nunca será compilado e Android Studiomostra um erro na última linha.