kotlinx.android.synthetic wird nicht mehr empfohlen. Entfernen zugunsten der expliziten findViewById
Dies war natürlich sehr praktisch, insbesondere wenn Sie ein Projekt vollständig in Kotlin haben. Die Welt verändert sich jedoch und jetzt müssen wir nach Alternativen suchen. In diesem Artikel werfen wir einen kurzen Blick darauf, was das Kotlin Android Extension-Plugin ist, welche Probleme damit aufgetreten sind und was wir als Android-Entwickler jetzt tun sollten. Zum Teil wurde das Material in diesem Artikel verwendet . So lass uns gehen.
Kotlin Android Extensions auf einen Blick
Kotlin Android Extensions ist ein Kotlin-Plugin, mit dem Sie Ansichten aus Aktivitäten, Fragmenten und Ansichten wiederherstellen können, ohne Standard-Boilerplate-Code wie findViewById zu schreiben.
Das Plugin generiert zusätzlichen Code, mit dem Sie als XML auf die Ansicht zugreifen können, als würden Sie sich mit den Eigenschaften mit dem Namen id befassen, die Sie beim Definieren der Struktur verwendet haben.
Außerdem wird ein lokaler Ansichtscache erstellt. Wenn Sie die Eigenschaft zum ersten Mal verwenden, führt das Plugin die Standard-findViewById aus. Anschließend wird die Ansicht aus dem Cache wiederhergestellt, sodass der Zugriff darauf schneller erfolgt.
Wenn das alles so bequem ist, warum dann veraltet?
Probleme mit Kotlin Android Extensions
- . , view — , id.
- Kotlin ()
- Null Safety. , view — , .
- . : UI Kit, UI-, . issues . findViewById :(
- , , — , , . — Kotlin Android Extensions .
- KotterKnife (, ).
- FindViewById() — , .
- AndroidAnnotations ( 2015)
- View Binding Google — !
View Binding Google
Der Gewinner auf dieser Liste ist also Googles ViewBinding (nicht zu verwechseln mit DataBinding). Werfen wir einen kurzen Blick darauf, was es ist.
Die Ansichtsbindung ist ein Tool, das das Schreiben von Code für die Interaktion mit einer Ansicht erleichtert. Wenn Sie die Ansichtsbindung in einem bestimmten Modul aktivieren, werden Bindungsklassen für jede Layoutdatei im Modul generiert. Das Objekt der generierten Bindungsklasse enthält Links zu allen Ansichten aus der Markup-Datei, für die android: id angegeben ist.
Die Hauptvorteile der Ansichtsbindung sind Nullsicherheit und Typensicherheit.
Erste Schritte mit der Ansichtsbindung
Der Einstieg in ViewBinding ist einfach genug. Sie müssen eine Option zu build.gradle hinzufügen:
android {
...
buildFeatures {
viewBinding true
}
}
Danach können Sie es bereits verwenden. Jede generierte Bindungsklasse enthält einen Link zur Stammansicht des Markups (Stamm) und Links zu allen Ansichten mit der ID. Der generierte Klassenname wird als "Markup-Dateiname" gebildet, übersetzt in Kamelfall + "Bindung". Beispiel für die Markup-Datei result_profile.xml:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
Eine ResultProfileBinding-Klasse wird generiert, die zwei Felder enthält: TextView-Name und Schaltfläche-Schaltfläche.
Verwendung in Aktivität
Zum Beispiel haben Sie dieses 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>
Das Ergebnis der ViewBinding:
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ConstraintLayout rootView;
@NonNull
public final TextView textView;
Sie können viewBinding folgendermaßen verwenden:
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
Und jetzt, nachdem wir die Links zur Ansicht erhalten haben:
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
Wenn Sie ViewBinding in einem Fragment verwenden und den Link zur Bindung im Fragment (und nicht nur in der onCreateView () -Methode) beibehalten, vergessen Sie nicht, die Links in der onDestroyView () -Methode zu löschen.
Beispiel:
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
}
Dies muss aufgrund des Fragment- und Ansichtslebenszyklus erfolgen:
Im Allgemeinen ist der Wechsel zu ViewBinding nicht schwierig genug, obwohl es schade ist, dass die Kotlin Android Extensions veraltet sind. Vergessen Sie nicht, sich uns bei Telegram anzuschließen. Nützliche Materialien für Android-Entwickler und moderne Tutorials werden auf der AndroidSchool.ru- Plattform veröffentlicht .
Nützliche Links: