【问题标题】:Get String value from Edit Text with databinding使用数据绑定从编辑文本中获取字符串值
【发布时间】:2019-05-12 19:02:19
【问题描述】:

我正在尝试使用一些数据绑定来建立一个 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"
        />

在View Model(我的叫LogginMV)中,我定义了一个

private ObservableField<String> username = new ObservableField<>("");

将用户输入的文本绑定到username

我使用username.get() 尝试获取用户名,但我只得到""(我知道这是由于new ObservableField&lt;&gt;("") 中括号之间的值,如果它是“test”,我会得到“test ")

我确实创建了一个 getter 和 setter,如下所示:

public String getUsername(){
    return username.get();
}
public void setUsername(ObservableField<String> username) {
    this.username = username;
    this.username.notifyChange();
}

我的问题是我不知道如何正确进行绑定,所以我得到的是用户输入的内容,而不是我在 new ObservableField&lt;&gt;("") 中定义的内容。

【问题讨论】:

    标签: java android data-binding


    【解决方案1】:

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

    在视图(xml 文件)中添加:

    android:afterTextChanged="@{(edtitable)->LoginVM.afterUserNameChange(edtitable)}"
    

    这将触发视图模型中的函数afterUserNameChange

    public void afterUserNameChange(CharSequence s)
    {
        //Log.i("truc", s.toString());
        this.usrNm = s.toString();
    }
    

    用户在EditText中每次输入后都会触发此功能

    【讨论】:

      【解决方案2】:

      最好使用 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 中的文本,它会自动更新视图模型中的 _username 字段。现在您可以在布局中创建 onClick 函数并使用您在 editText(_username) 中输入的值并进行一些有用的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        • 2015-01-02
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        • 2011-05-30
        相关资源
        最近更新 更多