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:

  1. 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.
  2. Rufen Sie einen Verweis auf die Stammansicht ab, indem Sie die Methode getRoot() aufrufen oder mit der Kotlin-Eigenschaft Syntax.
  3. 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() :

  1. 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.
  2. Rufen Sie einen Verweis auf die Stammansicht ab, indem Sie die Methode getRoot() aufrufen oder mit der Kotlin-Eigenschaft Syntax.
  3. 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:

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