Ich habe mit der Android-Datenbindungsbibliothek experimentiert, die dem Google-Entwicklerhandbuch folgt. Aber auch mit dem Folgen ihres Codes funktioniert notifyPropertyChanged()
nie.Android-Datenbindung mCallback ist immer null
mCallbacks in der BaseObservable
ist immer null. Ich habe den Code debugged als die Bindung eingerichtet ist und addOnPropertyChangedCallback
aufgerufen wird und mCallbacks festgelegt ist, aber aus irgendeinem Grund wurde diese Referenz verloren, wenn Sie um notifyPropertyChanged()
aufrufen.
Es gibt wahrscheinlich etwas, das ich vermisse, so würde jede Hilfe sehr geschätzt werden!
Code:
public class TestActivity extends AppCompatActivity {
TestModel mTestModel;
ActivityTestBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_test);
mTestModel = new TestModel("Test", "User");
mBinding.setTestModel(mTestModel);
mBinding.ratingBtnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTestModel.setFirstName("New");
mTestModel.setLastName("WOOOOORKS");
mBinding.notifyPropertyChanged(BR.firstName);
}
});
}}
public class TestModel extends BaseObservable {
private String firstName;
private String lastName;
public TestModel(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Bindable
public String getFirstName() {
return this.firstName;
}
@Bindable
public String getLastName() {
return this.lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}}
Layout:
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<data>
<variable
name="testModel"
type="com.boundless.happymeter.model.TestModel"
/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{testModel.firstName}"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{testModel.lastName}"
/>
<Button
android:id="@+id/rating_btn_update"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="Update"
/>
</LinearLayout>
</layout>
Hinweis: Es ist möglich, die Bindung durch die Verwendung mBinding.invalidateAll() zu zwingen - aber das ist ein ziemlich hässlich soloution
, dass ein Reiz gearbeitet verwenden können! Ich benutzte mBinding.notifyPropertyChanged (anstelle der Super-Methode in BaseObservable), so dass der Rückruf natürlich null war, Danke! – enyciaa