ViewBinding
resolveu o maior problema de kotlinx.android.synthetic
. Na synthetic
associaçã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 ViewBinding
você 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_main
e activity_other
assim:
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_other
id não existe activity_main
e o compilador não verificou isso. Mas se você usar ViewBinding
assim:
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 Studio
mostra um erro na última linha.