我正在尝试使用一些数据绑定来放置MVVM结构。
我已经为视图创建了以下xml文件(示例):
<data>
<variable
name="LoginVM"
type="org.ledeme.animekeeper.LogginMV"/>
<EditText
android:id = "@+id/input_loggin"
android:text="@{LoginVM.username}"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_marginTop="200sp"
android:layout_centerHorizontal="true"
android:hint="@string/login"
android:width="200sp"
android:inputType="text"
android:textAlignment="center"
android:singleLine="true"
android:lines="1"
android:maxLines="1"
/>
在视图模型(我的模型称为LogginMV)中,我定义了
private ObservableField<String> username = new ObservableField<>("");
将用户输入的文本绑定到username
我使用username.get()
来尝试获取用户名,但是我只能获取""
(我知道这是由于new ObservableField<>("")
中括号之间的值,如果它是“ test”的话) ,我会得到“测试”)
我确实创建了如下的吸气剂和吸气剂:
public String getUsername(){
return username.get();
}
public void setUsername(ObservableField<String> username) {
this.username = username;
this.username.notifyChange();
}
我的问题是我无法弄清楚如何正确进行绑定,因此我得到的是用户输入的内容,而不是我在new ObservableField<>("")
中定义的内容。
答案 0 :(得分:2)
我发现一个调整效果很好:
在视图(xml文件)中添加以下内容:
android:afterTextChanged="@{(edtitable)->LoginVM.afterUserNameChange(edtitable)}"
这将触发视图模型中的功能afterUserNameChange
。
public void afterUserNameChange(CharSequence s)
{
//Log.i("truc", s.toString());
this.usrNm = s.toString();
}
用户在EditText
中进行的每次输入后都会触发此功能
答案 1 :(得分:0)
最好使用LiveData和MutableLiveData模式。 在您的ViewModel LoginVM中声明:
private var _username = MutableLiveData<String?>()
var username: LiveData<String?> = null
get() = _username
然后在xml中为EditText添加以下内容:
android:afterTextChanged="@{LoginVM::setUsername}"
android:text="@{LoginVM.username}"
所以还要在LoginVM viemodel中定义setUsername函数:
fun setUsername(s: Editable){
_username.value = s.toString()
}
就是这样。现在,您的用户名发生了变化,因为它使viewmodel发生了变化。同样,如果您在EditText中更改文本,它将自动更新viewmodel中的_username字段。现在,您可以在布局中创建onClick函数,并使用您在editText(_username)中键入的值并执行一些有用的操作。