使用数据绑定从编辑文本中获取字符串值

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<>("").

fir*_*ost 7

我发现了一个很好的调整:

在视图(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


Leo*_*ton 6

最好使用 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) 中输入的值并执行一些有用的操作。