Bindung ansehen Teil von Android Jetpack
View Binding ist eine Funktion, die das Schreiben von Code für Interaktionen vereinfacht mit Ansichten. Sobald die Ansichtsbindung in einem Modul aktiviert ist, wird eine Bindung class für jede in diesem Modul vorhandene XML-Layoutdatei ein. Instanz einer Bindung enthält direkte Verweise auf alle Ansichten, die eine ID im Feld das entsprechende Layout.
In den meisten Fällen wird findViewById
durch eine Ansichtsbindung ersetzt.
Einrichten
Die Ansichtsbindung wird für jedes Modul einzeln aktiviert. Um die Bindung der Ansicht in einer
Modul verwenden, legen Sie die Build-Option viewBinding
auf Modulebene auf true
fest.
build.gradle
, wie im folgenden Beispiel gezeigt:
Cool
android { ... buildFeatures { viewBinding true } }
Kotlin
android { ... buildFeatures { viewBinding = true } }
Wenn Sie möchten, dass eine Layoutdatei beim Generieren von Bindungsklassen ignoriert wird, fügen Sie
das Attribut tools:viewBindingIgnore="true"
der Stammansicht dieses Layouts
Datei:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
Nutzung
Wenn die Ansichtsbindung für ein Modul aktiviert ist, wird für jedes Modul eine Bindungsklasse generiert. XML-Layoutdatei, die das Modul enthält. Jede Bindungsklasse enthält Verweise zur Stammansicht und allen Ansichten, die eine ID haben. Der Name der Bindungsklasse lautet durch Umwandeln des Namens der XML-Datei in die Pascal-Schreibweise und Hinzufügen des Wort „Bindung“ bis zum Ende.
Sehen wir uns als Beispiel eine Layoutdatei namens result_profile.xml
an, die
Folgendes:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
Die generierte Bindungsklasse heißt ResultProfileBinding
. In diesem Kurs gibt es zwei
ein TextView
namens name
und ein Button
namens button
. Die
ImageView
im Layout hat keine ID, sodass es im Layout
binding-Klasse.
Jede Bindungsklasse enthält auch eine getRoot()
-Methode, die eine direkte
Referenz für die Stammansicht der entsprechenden Layoutdatei. In diesem Beispiel
Die Methode getRoot()
in der Klasse ResultProfileBinding
gibt den Fehlerwert
LinearLayout
-Stammansicht.
In den folgenden Abschnitten wird die Verwendung generierter Bindungsklassen in Aktivitäten und Fragmente.
Bindung der Ansicht in Aktivitäten verwenden
Führen Sie den Befehl
die folgenden Schritte im
onCreate()
-Methode:
- Rufen Sie die statische Methode
inflate()
auf, die in der generierten Bindungsklasse enthalten ist. Dadurch wird eine Instanz der Bindungsklasse für die zu verwendende Aktivität erstellt. - Rufen Sie einen Verweis auf die Stammansicht ab, indem Sie die Methode
getRoot()
aufrufen oder mit der Kotlin-Eigenschaft Syntax. - Stammansicht übergeben an
setContentView()
um es zur aktiven Ansicht zu machen.
Diese Schritte werden im folgenden Beispiel gezeigt:
Kotlin
private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) val view = binding.root setContentView(view) }
Java
private ResultProfileBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ResultProfileBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); }
Sie können jetzt die Instanz der Binding-Klasse verwenden, um auf eine der Ansichten zu verweisen:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
Ansichtsbindung in Fragmenten verwenden
Führen Sie den Befehl
Schritte im Fragment-Abschnitt
onCreateView()
:
- Rufen Sie die statische Methode
inflate()
auf, die in der generierten Bindungsklasse enthalten ist. Dadurch wird eine Instanz der Bindungsklasse für das zu verwendende Fragment erstellt. - Rufen Sie einen Verweis auf die Stammansicht ab, indem Sie die Methode
getRoot()
aufrufen oder mit der Kotlin-Eigenschaft Syntax. - Geben Sie die Stammansicht aus der Methode
onCreateView()
zurück, um sie zur „Active View“ auf dem Bildschirm.
Kotlin
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 }
Java
private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; }
Sie können jetzt die Instanz der Binding-Klasse verwenden, um auf eine der Ansichten zu verweisen:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
Hinweise für verschiedene Konfigurationen bereitstellen
Wenn Sie Ansichten für mehrere Konfigurationen deklarieren, führt dies gelegentlich dazu, ist es sinnvoll, je nach Layout einen anderen Ansichtstyp zu verwenden. Das folgende Code-Snippet zeigt dies:
# in res/layout/example.xml
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" />
In diesem Fall erwarten Sie vielleicht, dass die generierte Klasse das Feld userBio
verfügbar macht.
vom Typ TextView
, da TextView
die gemeinsame Basisklasse ist. Aufgrund von
technischen Einschränkungen nicht feststellen kann,
generiert stattdessen ein View
-Feld. Dazu muss das Feld später mit
binding.userBio as TextView
Um diese Einschränkung zu umgehen, unterstützt die Ansichtsbindung ein tools:viewBindingType
können Sie dem Compiler mitteilen, welcher Typ im generierten Code verwendet werden soll.
Im vorherigen Beispiel können Sie dieses Attribut verwenden, um den Compiler
Generieren Sie das Feld als TextView
:
# in res/layout/example.xml (unchanged)
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />
Nehmen wir in einem anderen Beispiel an, Sie haben zwei Layouts, eines mit einem
BottomNavigationView
und eine weitere mit NavigationRailView
. Beide
Klassen erweitern NavigationBarView
, das den Großteil der Implementierung
Details. Wenn Ihr Code nicht genau wissen muss, welche abgeleitete Klasse in
Layout haben, können Sie mit tools:viewBindingType
das generierte
in beiden Layouts in NavigationBarView
eingeben:
# in res/layout/navigation_example.xml
<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
# in res/layout-w720/navigation_example.xml
<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
Die View-Bindung kann den Wert dieses Attributs beim Generieren von Code nicht validieren. Bis Kompilierungszeit- und Laufzeitfehler vermeiden, muss der Wert die folgenden Bedingungen:
- Der Wert muss eine Klasse sein, die Werte von
android.view.View
übernimmt. Der Wert muss eine übergeordnete Klasse des Tags sein, in das er platziert wird. Beispiel: Der Parameter Folgende Werte funktionieren nicht:
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. --> <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
Der letzte Typ muss in allen Konfigurationen einheitlich aufgelöst werden.
Unterschiede zu findViewById
Die Bindung der Ansicht hat wichtige Vorteile gegenüber der Verwendung von findViewById
:
- Null-Sicherheit: Da durch die Bindung der Ansicht direkte Verweise auf Ansichten erzeugt werden,
gibt es kein Risiko einer Nullzeigerausnahme aufgrund einer ungültigen Ansichts-ID.
Wenn eine Ansicht nur in bestimmten Konfigurationen einer
Layout wird das Feld mit seinem Verweis in der Bindungsklasse markiert.
mit
@Nullable
. - Typsicherheit: Die Felder in jeder Bindungsklasse haben Typen, die der Ansichten, auf die sie in der XML-Datei verweisen. Es besteht also kein Risiko, dass Streaming-Ausnahme.
Diese Unterschiede bedeuten Inkompatibilitäten zwischen Ihrem Layout und Ihrem Code. führen dazu, dass Ihr Build zur Kompilierungszeit und nicht zur Laufzeit fehlschlägt.
Vergleich mit Datenbindung
Bindung und Datenbindung generieren Bindungsklassen, mit denen Sie direkt auf Ansichten verweisen können. Sie können sich jedoch Bindung ist für einfachere Anwendungsfälle gedacht und bietet Folgendes: Vorteile gegenüber der Datenbindung:
- Schnellere Kompilierung:Für die Ansichtsbindung ist keine Anmerkungsverarbeitung erforderlich. schneller zu kompilieren.
- Nutzerfreundlichkeit:Zum Ansehen der Bindung ist kein speziell getaggtes XML-Layout erforderlich. -Dateien, sodass sie in Ihren Apps schneller übernommen werden können. Wenn Sie die Bindung der Ansicht Modul zu erstellen, wird es automatisch auf alle Layouts dieses Moduls angewendet.
Für die Bindung einer Ansicht gelten im Vergleich zu Daten folgende Einschränkungen: Bindung:
- Die Bindung der Ansicht unterstützt keine Layoutvariablen oder Layout Ausdrücke und kann daher nicht verwendet werden um dynamische UI-Inhalte direkt aus XML-Layoutdateien zu deklarieren.
- Die Bindung der Ansicht unterstützt keine Zwei-Wege-Daten binding.
Aus diesen Gründen ist es in manchen Fällen am besten, beide Datenansichten zu verwenden, Bindung und Datenbindung in einem Projekt. Sie können die Datenbindung in Layouts verwenden, erfordern erweiterte Funktionen und verwenden die Bindung der Ansicht in Layouts, bei denen dies nicht der Fall ist.
Weitere Informationen
Weitere Informationen zur Ansichtsbindung finden Sie in den folgenden zusätzlichen Ressourcen:
Produktproben
Blogs
Videos
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Von Kotlin-Synthetiken zur Jetpack-Ansichtsbindung migrieren
- Layouts und Bindungsausdrücke
- App-Architektur: UI-Ebene – Erste Schritte – Android-Entwickler