[JAVA] Bereinigen Sie findViewById aus dem Quellcode mit DataBindingLibrary

Überblick

Eine der Komponenten von * Android Jetpack *, [* Data Binding Library *](https: // Entwickler. Ein Memorandum, das android.com/topic/libraries/data-binding/?hl=JA verwendet, um die Erfassung von View durch findViewById aus dem Quellcode zu löschen.

1. Aktivieren Sie * Data Binding Library * in build.gradle

app/build.gradle


android { 
    //Unterlassung
    dataBinding {
        enabled = true
    }
}

Fügen Sie das Obige hinzu

2. Fügen Sie die Layouteinstellungen in die Datei layout / *. Xml in <layout> </ layout> ein

layout/*.xml


<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <!--Layouteinstellungen-->
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".HogeActivity">

        <!--Unterlassung-->

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

Fügen Sie " </ layout>" zu Kopf und Schwanz hinzu und verschieben Sie nur "xmlns:" zu "". Dann wird automatisch eine "* Binding" -Klasse generiert, die "ViewDataBinding" erbt, basierend auf "layout / *. Xml". Der Klassenname ist der in UpperCamelCase konvertierte XML-Name. Wenn es nicht automatisch generiert wird, kann es herauskommen, wenn Sie es einmal neu erstellen.

4. Verwenden Sie die Bindungsklasse

Die Methode unterscheidet sich geringfügig je nach anzugebendem Ziel.

Für Aktivität

Activity.java


 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
-    setContentView(R.layout.activity);
+    final ActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity);

-    final TextView textView = findViewById(R.is.text_view);
-    textView.setText("HogeFuga");
+    binding.textView.setText("HogeFuga");

Beachten Sie den Rückgabetyp "DataBindingUtil.setContentView". (Da es sich um einen generischen Typ handelt, wird jede Klasse akzeptiert, die "ViewDataBinding" erbt.)

Für Fragment (Muster 1)

Fragment.java


+private FragmentBinding binding;

 @Override
 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                          @Nullable Bundle savedInstanceState) {
-    return inflater.inflate(R.layout.fragment, container, false);
+    binding = FragmentBinding.inflate(inflater, container, false);
+    return binding.getRoot();
 }

 @Override
 public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
-    final TextView textView = findViewById(R.is.text_view);
-    textView.setText("HogeFuga");
+    binding.textView.setText("HogeFuga");
 }

Ein Muster, das eine Ansicht aus der Bindungsklasse erstellt. Ist es nicht gut, eine Bindungsklasse im Feld zu haben?

Für Fragment (Muster 2)

Fragment.java


+private FragmentBinding binding;

 @Override
 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                          @Nullable Bundle savedInstanceState) {
     return inflater.inflate(R.layout.fragment, container, false);
 }

 @Override
 public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
-    final TextView textView = findViewById(R.is.text_view);
-    textView.setText("HogeFuga");
+    final FragmentBinding binding = FragmentBinding.bind(getView());
+    binding.textView.setText("HogeFuga");
 }

Ein Muster, das zuerst eine Ansicht und dann eine darauf basierende Bindungsinstanz erstellt. In diesem Fall ist es nicht erforderlich, es vor Ort zu haben.

Für RecyclerView.Adapter

diff:RecyclerView.Adapter.java


 @NonNull
 @Override
 public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
-    final View view = inflater.inflate(R.layout.recycler_row, parent, false);
-    return new ViewHolder(view);
+    final RecyclerViewAdapterBinding binding = RecyclerViewAdapterBinding.inflate(inflater, parent, false);
+    return new ViewHolder(binding);
 }

 @Override
 public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
     holder.bind("HogeFuga");
 }

 class ViewHolder extends RecyclerView.ViewHolder {
     @NonNull
-    private final TextView textView;
+    private final RecyclerRowBinding binding;

-    private MainViewHolder(@NonNull View view) {
-        super(view);
-        textView = view.findViewById(R.id.text_view);
+    private MainViewHolder(@NonNull RecyclerRowBinding binding) {
+        super(binding.getRoot());
+        this.binding = binding;
     }

     void bind(@NonNull String text) {
-        textView.setText(text);
+        binding.textView.setText(text);
     }
 }

Wenn Sie es für * RecyclerView.Adapter * verwenden, sollten Sie * groupie * oder * epoxy * verwenden, um die Notwendigkeit von * RecyclerView.ViewHolder * zu beseitigen.

Punkte, um die man sich Sorgen machen muss

--Welche Muster 1 und 2 eignen sich besser für Fragmente?

Recommended Posts

Bereinigen Sie findViewById aus dem Quellcode mit DataBindingLibrary
Reinigen Sie Ihren Code mit Butter Knife
Code Java von Emacs mit Eclim
Installieren Sie samba4 aus dem Quellcode unter CentOS8
[Java] Fluss vom Quellcode zur Ausführung
Generieren Sie den Quellcode aus der JAR-Datei mit der JD-GUI des Java Decompiler-Projekts
Führen Sie Java-Code von cpp auf cocos2dx aus
Memorandum zum Bereinigen des Codes Ruby