Ich versuche, dem Beispiel für Datenbindung aus dem offiziellen Google Doc zu folgen https://developer.android.com/tools/data-binding/guide.html
außer dass ich versuche, Daten-Biding auf ein Fragment anzuwenden, nicht auf eine Aktivität.
Der Fehler, den ich derzeit beim Kompilieren erhalte, ist
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
für Fragment sieht so aus:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
onCreateView
für Fragment sieht so aus:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
und Teile meiner Layoutdatei für Fragment sehen folgendermaßen aus:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="marsdata"
type="uk.co.darkruby.app.myapp.MarsDataProvider" />
</data>
...
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@{marsdata.martianSols}"
/>
</RelativeLayout>
</layout>
Mein Verdacht ist, dass MartianDataBinding
ich nicht weiß, an welche Layoutdatei es gebunden werden soll - daher der Fehler. Irgendwelche Vorschläge?
quelle
View view = binding.getRoot();
Ich habe so lange daran festgehalten, dass ich zu Recht ziemlich verärgert bin, dass ich auf developer.android.com keine Dokumentation darüber finden konnte ... Das Problem wurde behoben. Danke dir!Sie werden tatsächlich aufgefordert, die
inflate
Methode Ihrer generierten Bindung und nicht die DataBindingUtil zu verwenden:Dokumente für DataBindingUtil.inflate () :
quelle
cannot be resolved to a type
Fehler beim Erstellen um. Es ist meiner Meinung nach nicht zuverlässig. Wenn ich zuerst mit geheDataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);
und es dann ändereFragmentCameraBinding.inflate(inflater, container, false);
, funktioniert es, aber nach dem Wiederherstellen gibt es den Fehler erneut.DataBindingUtil.inflate
MainFragmentBinding
Klasse impliziert . Diese Klasse wird aus der Layoutdatei generiert, sodass das gewünschte Layout automatisch angewendet wird.Sogar die anderen Antworten mögen gut funktionieren, aber ich möchte den besten Ansatz nennen.
Verwendung
Binding class's inflate
wie in der Android-Dokumentation empfohlen .Eine Möglichkeit ist das Aufblasen,
DataBindingUtil
aber wenn nur Sie nicht wissen, dass Sie eine Bindungsklasse generiert haben .- Sie haben automatisch generiert
binding class
, verwenden Sie diese Klasse anstelle vonDataBindingUtil
.In Java
In Kotlin
In der Dokumentation zur DataBindingUtil- Klasse sehen Sie.
Wenn Ihre Layout-Biniding-Klasse nicht generiert wird, lesen Sie diese Antwort .
quelle
inflate
Methode verwenden, die dasLayoutInflater
als einziges Argument verwendet?ViewGroup container
?container
benötigt wird, wenn esattachToRoot
isttrue
.Wenn Sie ViewModel und LiveData verwenden Dies ist die ausreichende Syntax
Kotlin-Syntax:
quelle
Versuchen Sie dies in Android DataBinding
quelle
Man kann einfach das Ansichtsobjekt wie unten erwähnt abrufen
quelle
Kotlin-Syntax:
quelle
Wie die meisten gesagt haben, aber vergessen Sie nicht, LifeCycleOwner
Sample in Java festzulegen, dh
quelle
in meinem Code arbeiten.
quelle
Ein vollständiges Beispiel für die Datenbindung von Fragmenten
FragmentMyProgramsBinding ist eine Bindungsklasse, die für res / layout / fragment_my_programs generiert wurde
quelle
Sehr hilfreicher Blog über Datenbindung: https://link.medium.com/HQY2VizKO1
Deklarieren Sie den Bindungswert wie folgt in Fragment:
Vergessen Sie nicht, dies in Fragmenten zu schreiben
quelle
Ein weiteres Beispiel in Kotlin:
Beachten Sie, dass der Name "MartianDataBinding" vom Namen der Layoutdatei abhängt. Wenn die Datei "martian_data" heißt, lautet der korrekte Name MartianDataBinding.
quelle
Jeder sagt darüber
inflate()
, aber was ist, wenn wir es verwenden wollenonViewCreated()
?Sie können die
bind(view)
Methode der konkreten Bindungsklasse verwenden, um dieViewDataBinding
Instanz für die zu erhaltenview
.Normalerweise schreiben wir BaseFragment wie folgt (vereinfacht):
Und verwenden Sie es in untergeordneten Fragmenten.
Wenn alle Fragmente Datenbindung verwenden, können Sie dies mithilfe des Typparameters sogar vereinfachen.
Ich weiß nicht, ob es in Ordnung ist, dort Nicht-Null zu behaupten, aber ... Sie haben die Idee. Wenn Sie möchten, dass es nullbar ist, können Sie es tun.
quelle