android 双向绑定 /w LiveData 使用 Java
android two-way binding /w LiveData using Java
我尝试在 Java 中实现双向数据绑定,但我无法让它工作。似乎没有太多关于 Kotlin 的内容 material。我现在拥有的:
一个简单的 ViewModel
当我通过 @={dashBoardViewModel.text}
引用 MutableLiveData 属性时,我必须创建它们 public
,否则编译器会抱怨找不到 FragmentDashBoardDataBindingImpl。
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class DashboardViewModel extends ViewModel {
public MutableLiveData<String> text;
public MutableLiveData<String> name;
public DashboardViewModel() {
text = new MutableLiveData<>();
name = new MutableLiveData<>();
text.setValue("This is the dashboard");
}
public void onSave() {
String oldValue = text.getValue();
String newValue = "new value " + name.getValue();
text.setValue(newValue);
}
}
片段中的简单布局:
<?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">
<data>
<variable
name="dashBoardViewModel"
type="example.com.ui.dashboard.DashboardViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
...
tools:context=".ui.dashboard.DashboardFragment">
<TextView
android:id="@+id/text_dashboard"
...
android:text="@={dashBoardViewModel.text}"
... />
<EditText
...
android:inputType="textPersonName"
android:text="@={dashBoardViewModel.name}"
... />
<Button
...
android:onClick="@{() -> dashBoardViewModel.onSave()}"
...
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
在构造函数中,我调用了 text.setValue("This is the dashboard")
,它工作正常并且值显示得很好。
在点击侦听器 dashBoardViewModel.onSave()
中,我可以调用 text.setValue(newValue)
并分配正确的值,但该值永远不会显示。
所以 text.setValue()
似乎在同一个 class / 同一个实例中工作不同。
如有任何提示,我们将不胜感激。
您可能忘记将 lifecycleowner
给您的 databinding
。你应该检查 this one
我尝试在 Java 中实现双向数据绑定,但我无法让它工作。似乎没有太多关于 Kotlin 的内容 material。我现在拥有的:
一个简单的 ViewModel
当我通过 @={dashBoardViewModel.text}
引用 MutableLiveData 属性时,我必须创建它们 public
,否则编译器会抱怨找不到 FragmentDashBoardDataBindingImpl。
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class DashboardViewModel extends ViewModel {
public MutableLiveData<String> text;
public MutableLiveData<String> name;
public DashboardViewModel() {
text = new MutableLiveData<>();
name = new MutableLiveData<>();
text.setValue("This is the dashboard");
}
public void onSave() {
String oldValue = text.getValue();
String newValue = "new value " + name.getValue();
text.setValue(newValue);
}
}
片段中的简单布局:
<?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">
<data>
<variable
name="dashBoardViewModel"
type="example.com.ui.dashboard.DashboardViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
...
tools:context=".ui.dashboard.DashboardFragment">
<TextView
android:id="@+id/text_dashboard"
...
android:text="@={dashBoardViewModel.text}"
... />
<EditText
...
android:inputType="textPersonName"
android:text="@={dashBoardViewModel.name}"
... />
<Button
...
android:onClick="@{() -> dashBoardViewModel.onSave()}"
...
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
在构造函数中,我调用了 text.setValue("This is the dashboard")
,它工作正常并且值显示得很好。
在点击侦听器 dashBoardViewModel.onSave()
中,我可以调用 text.setValue(newValue)
并分配正确的值,但该值永远不会显示。
所以 text.setValue()
似乎在同一个 class / 同一个实例中工作不同。
如有任何提示,我们将不胜感激。
您可能忘记将 lifecycleowner
给您的 databinding
。你应该检查 this one