fir*_*ost 2 java data-binding android
我正在尝试使用一些数据绑定来放置 MVVM 结构。
我为视图创建了以下 xml 文件(示例):
<data>
<variable
name="LoginVM"
type="org.ledeme.animekeeper.LogginMV"/>
Run Code Online (Sandbox Code Playgroud)
<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"
/>
Run Code Online (Sandbox Code Playgroud)
在视图模型(我的称为 LogginMV)中,我定义了一个
private ObservableField<String> username = new ObservableField<>("");
Run Code Online (Sandbox Code Playgroud)
将用户输入的文本绑定到 username
我曾经username.get()尝试获取用户名,但我只得到""(我知道这是由于括号之间的值造成的new ObservableField<>(""),如果它是“test”,我会得到“test”)
我确实创建了一个 getter 和 setter,如下所示:
public String getUsername(){
return username.get();
}
public void setUsername(ObservableField<String> username) {
this.username = username;
this.username.notifyChange();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法弄清楚如何正确进行绑定,所以我得到的是用户输入的内容而不是我在new ObservableField<>("").
我发现了一个很好的调整:
在视图(xml 文件)中添加:
android:afterTextChanged="@{(edtitable)->LoginVM.afterUserNameChange(edtitable)}"
Run Code Online (Sandbox Code Playgroud)
这将触发afterUserNameChange视图模型中的函数。
public void afterUserNameChange(CharSequence s)
{
//Log.i("truc", s.toString());
this.usrNm = s.toString();
}
Run Code Online (Sandbox Code Playgroud)
这个函数在用户每次输入后触发 EditText
最好使用 LiveData 和 MutableLiveData 模式。在您的 ViewModel LoginVM 中声明:
private var _username = MutableLiveData<String?>()
var username: LiveData<String?> = null
get() = _username
Run Code Online (Sandbox Code Playgroud)
然后在 EditText 的 xml 中添加以下内容:
android:afterTextChanged="@{LoginVM::setUsername}"
android:text="@{LoginVM.username}"
Run Code Online (Sandbox Code Playgroud)
因此,还要在 LoginVM viemodel 中定义 setUsername 函数:
fun setUsername(s: Editable){
_username.value = s.toString()
}
Run Code Online (Sandbox Code Playgroud)
就是这样。现在,您的用户名会随着视图模型中某些内容的变化而发生变化。此外,如果您更改 EditText 中的文本,它会自动更新视图模型中的 _username 字段。现在,您可以在布局中创建 onClick 函数,并使用您在 editText(_username) 中输入的值并执行一些有用的操作。
| 归档时间: |
|
| 查看次数: |
5642 次 |
| 最近记录: |