View Binding erleichtert das Schreiben von Code, der mit Ansichten interagiert. So richten Sie es in Ihrem Android Gradle-Projekt ein.
Den Klassiker dürften die meisten Android-Entwickler kennen findViewById()
Methode. Übergeben Sie ihm eine ID einer der Ansichten in Ihrem XML-Layout und es wird ein Verweis auf die erweiterte Version dieser Ansicht zurückgegeben. Dies setzt jedoch alles voraus, dass Sie die richtige ID übergeben haben und dass die Ansicht tatsächlich existiert. findViewById()
verfügt über keine integrierten Prüfungen, die verhindern, dass Sie versuchen, eine Ansicht abzurufen, die Sie nicht abrufen können. Geben Sie View Binding ein.
Anstatt zu verwenden findViewById()
Für jede gewünschte Ansicht generiert View Binding automatisch eine Bindungsklasse für jedes Layout-XML. Jede Ansicht mit einer ID wird automatisch zur Klasse hinzugefügt, sodass Sie direkt darauf verweisen können.
Das Hinzufügen von View Binding zu einem Android Gradle-Projekt ist ganz einfach.
Gradle-Setup
View Binding ist auf Modulebene in Gradle aktiviert. Wenn Sie über mehrere Module verfügen, müssen Sie diese für jedes einzeln aktivieren.
Im android
Block in Ihrer Modulebene build.gradle
, fügen Sie die Option zum Aktivieren der Ansichtsbindung hinzu.
android {
...
buildFeatures {
viewBinding true
}
}
Möglicherweise gibt es eine Warnung vor illegalem Zugriff, aber das ist ein Flusenfehler und kann getrost ignoriert werden.
Synchronisieren Sie das Projekt und View Binding wird aktiviert. So einfach ist das.
Verwenden der Ansichtsbindung
Es gibt mehrere Möglichkeiten, View Binding zu verwenden, aber bevor das geschieht, sprechen wir darüber, wie die Bindungsklassen generiert werden.
Syntax für Klassennamen
Angenommen, Sie haben ein Layout-XML mit dem Namen some_layout.xml
. Die entsprechende Bindungsklasse wird benannt SomeLayoutBinding
. Dieses Muster gilt für alle Dateien.
Jedes Wort (getrennt durch Unterstriche im Dateinamen) wird großgeschrieben und die Unterstriche werden entfernt. „Binding“ wird dann am Ende hinzugefügt.
Instanziieren mit vorhandener Ansicht
Wenn Sie die Layoutdatei bereits erweitert haben und einen Verweis auf das Stammverzeichnis des Layouts haben, können Sie die View-Bindungsklasse anweisen, das vorhandene Layout zu verwenden.
Kotlin:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
Wenn Sie beispielsweise die Bindungsklasse in einem Fragment verwenden möchten, würde dies in etwa so aussehen.
Kotlin:
classSomeFragment : Fragment(R.layout.some_layout) {
//Lazy initialization means bind() won't be called until "binding" is referenced.
private val binding by lazy { SomeLayoutBinding.bind(view) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)
//Once this method is called, you can start using the binding.
}
}
Java:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;publicSomeFragment(){
super(R.layout.some_layout);
}
@Override
publicvoidonViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
//Initialize the binding.
binding = SomeLayoutBinding.bind(view);
}
}
Instanziieren mit neuer Ansicht
Die Bindungsklasse kann auch das Aufblasen des Layouts für Sie übernehmen.
Kotlin:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
Diese Methode ist sowohl in Fragmenten als auch in Aktivitäten nützlich.
Ein Beispielfragment würde etwa wie folgt aussehen.
Kotlin:
classSomeFragment : Fragment() {
private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?){
//The "root" of the binding class is the root of its layout.
return binding.root
}
}
Java:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;
@Override
publicvoidonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//Initialize the binding.
binding = SomeLayoutBinding.inflate(inflater);
//The "getRoot()" method of the binding class returns the root of the layout.
return binding.getRoot();
}
}
Ein Beispielaktivität würde etwa wie folgt aussehen.
Kotlin:
classSomeActivity : AppCompatActivity() {
private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.root)
}
}
Java:
publicclassSomeActivityextendsAppCompatActivity{
private SomeLayoutBinding binding = null;@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Instantiate the binding.
binding = SomeLayoutBinding.inflate(getLayoutInflater());
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.getRoot());
}
}
Referenzieren von Ansichten
Nachdem die View-Bindungsklasse nun eingerichtet und einsatzbereit ist, ist es an der Zeit, sie tatsächlich zu verwenden.
Sagen wir den Inhalt des some_layout.xml
sind etwa die folgenden:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Es gibt viele IDs, auf die im Code verwiesen werden kann. Aber solange Sie die Bindungsklasse instanziiert haben, wird die Referenzierung einfach sein.
In Kotlin werden Ansichten mit einigen Änderungen durch Variablen referenziert, die ihren IDs entsprechen. Unterstriche werden entfernt und die resultierende Zeichenfolge wird in Kamelbuchstaben geschrieben. Zum Beispiel als Referenz some_frame_layout
aus dem Code, den Sie verwenden würden binding.someFrameLayout
. Der someFrameLayout
Variable wird eine Instanz von FrameLayout sein.
val someFrameLayout: FrameLayout = binding.someFrameLayout
In Java werden Ansichten durch Getter-Methoden referenziert, die ihren IDs entsprechen, mit einem ähnlichen Format wie Kotlin. Zum Beispiel als Referenz some_frame_layout
, würden Sie verwenden binding.getSomeFrameLayout()
. Die Methode gibt eine Instanz von FrameLayout zurück.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Die Ansichtsverweise werden auch in der Bindung abgeflacht. Referenzierung inner_imageview
ist dasselbe wie Referenzieren some_frame_layout
.
Abschluss
Wie Sie sicher sehen können, ist View Binding in Android sowohl einfach zu implementieren als auch einfach zu verwenden. In vielen Fällen ist die Verwendung einfacher als findViewById()
.
Weitere Details zur Implementierung von View Binding sowie einige Beispiele finden Sie unter Schauen Sie sich die offizielle Dokumentation von Google an.