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

时间:2018-12-11 18:14:52

标签: java android data-binding

我正在尝试使用一些数据绑定来放置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<>("")中定义的内容。

2 个答案:

答案 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)中键入的值并执行一些有用的操作。