kotlinx.android.synthetic não é mais uma prática recomendada. Removendo em favor de findViewById explícito
Claro, isso foi muito conveniente, especialmente se você tiver um projeto inteiramente em Kotlin. No entanto, o mundo está mudando e agora precisamos buscar alternativas. Neste artigo, daremos uma olhada rápida no que é o plugin Kotlin Android Extension, quais eram os problemas com ele e agora o que nós, desenvolvedores Android, devemos fazer. Em parte, o material deste artigo foi usado . Então vamos.
Resumo das Extensões Kotlin para Android
Kotlin Android Extensions é um plug-in Kotlin que permite restaurar visualizações de Activities, Fragments e Views sem escrever código clichê padrão como findViewById.
O plugin gera um código adicional que permite acessar a visão como XML, como se você estivesse lidando com as propriedades chamadas id que você usou ao definir a estrutura.
Ele também cria um cache de exibição local. No primeiro uso da propriedade, o plug-in executará o findViewById padrão. Posteriormente, a visualização será restaurada do cache, para que o acesso a ele seja mais rápido.
Se tudo isso é tão conveniente, por que o descontinuou?
Problemas de extensões Kotlin Android
- . , view — , id.
- Kotlin ()
- Null Safety. , view — , .
- . : UI Kit, UI-, . issues . findViewById :(
- , , — , , . — Kotlin Android Extensions .
- KotterKnife (, ).
- FindViewById() — , .
- AndroidAnnotations ( 2015)
- View Binding Google — !
View Binding Google
Portanto, o vencedor nesta lista é o ViewBinding do Google (não deve ser confundido com DataBinding). Vamos dar uma olhada rápida no que é.
View Binding é uma ferramenta que torna mais fácil escrever código para interagir com uma visão. Quando você ativa a View Binding em um módulo específico, ela gera classes de binding para cada arquivo de layout no módulo. O objeto da classe de vinculação gerada contém links para todas as visualizações do arquivo de marcação para o qual android: id é especificado.
As principais vantagens da vinculação de visualização são segurança nula e segurança de tipo.
Introdução ao View Binding
Começar com ViewBinding é bastante fácil. Você precisa adicionar uma opção para build.gradle:
android {
...
buildFeatures {
viewBinding true
}
}
Depois disso, você já pode usar. Cada classe de ligação gerada contém um link para a visualização raiz da marcação (raiz) e links para todas as visualizações que possuem id. O nome da classe gerada é formado como "nome do arquivo de marcação", traduzido para caixa de camelo + "Ligação". Por exemplo, para o arquivo de marcação result_profile.xml:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
Uma classe ResultProfileBinding será gerada contendo 2 campos: nome de TextView e botão de botão.
Uso na atividade
Por exemplo, você tem este layout:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
O resultado da ViewBinding:
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ConstraintLayout rootView;
@NonNull
public final TextView textView;
Você pode usar viewBinding assim:
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
E agora, depois de obter os links para a vista:
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
Se você estiver usando ViewBinding em um fragmento e manter o link para a vinculação no fragmento (e não apenas no método onCreateView ()), não se esqueça de limpar os links no método onDestroyView ().
Exemplo:
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
Isso deve ser feito por causa do fragmento e do ciclo de vida da visualização:

em geral, mudar para ViewBinding não é difícil o suficiente, embora seja uma pena que as extensões Kotlin para Android estejam obsoletas. Não se esqueça de se juntar a nós no Telegram e na plataforma AndroidSchool.ru , materiais úteis para desenvolvedores Android e tutoriais modernos são publicados.
Links Úteis: