这可以将参数发送到xml视图中的绑定事件

时间:2016-12-21 14:27:28

标签: android xml android-databinding

我试图在Android中使用DataBinding。 但我脑子里有一个问题。

我想将edittext的文本发送到xml中的绑定函数。 我的意思是;单击登录按钮时,我想从xml ID获取当前用户名和密码。有可能吗?

这就是我想要的:

android:onClick="@{() -> login.onLogin(login_edt_username.text, login_edt_password.text)}"

我目前的用法:

代码:

@Override
protected void onStart() {
    super.onStart();
    binding= DataBindingUtil.setContentView(this,R.layout.activity_login);
}

@Override
public void onLogin() {
    login(binding.loginEdtUserName.getText(),binding.loginEdtPassword.getText());
}

XML:

<layout>

<data>

    <variable
        name="login"
        type="interfaces.login.LoginInterface" />

</data>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_login"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.friends.LoginActivity">

    <EditText
        android:id="@+id/login_edt_user_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Username" />

    <EditText
        android:id="@+id/login_edt_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/login_edt_user_name"
        android:hint="Password"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/login_btn_sign_in"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="@{() -> login.onLogin()}"
        android:layout_below="@+id/login_edt_password"
        android:text="SIGN IN" />

    <Button
        android:id="@+id/login_btn_register"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="@{() -> login.onRegister()}"
        android:layout_below="@+id/login_btn_sign_in"
        android:text="REGISTER" />

</RelativeLayout>

提前致谢。

3 个答案:

答案 0 :(得分:4)

这可以使用双向数据绑定解决(从Gradle插件的2.1版开始提供)。

替代 1:

在XML中导入android.view.View

<data ...>
   <import type="android.view.View"/>
</data>

然后,您将能够直接在XML中引用视图的some属性。在Lambda Expressions中,就像您正在使用的那样,您也可以像在Java中一样使用Views。 具体地:

android:onClick="@{() -> login.onLogin(login_edt_username.getText().toString(), login_edt_password.getText().toString())}"

替代 2:使用POJO。 给定POJO建模您的凭证信息,例如

public class Credentials {
    public String username;
    public String password;
}

,在XML中声明此模型后

<data>
  <variable
     name="login"
     type="interfaces.login.LoginInterface" />
  <variable
     name="credentials"
     type="models.login.Credentials" />
</data>

你可以这样做:

   <!-- .... -->
   <EditText
       android:id="@+id/login_edt_user_name"
       android:layout_width="match_parent"
       <!-- This binds the value of the Edittext to the Model. Note the equals sign! -->
       android:text="@={credentials.username}" />

   <EditText
       android:id="@+id/login_edt_password"
       <!-- Same here -->
       android:text="@={credentials.password}" />

   <!-- ... -->

最后,以满足您的要求

android:onClick="@{() -> login.onLogin(credentials.username, credentials.password)}"

答案 1 :(得分:2)

向视图添加id时,此视图可通过绑定中的此ID访问。这包括从布局本身设置的绑定中访问它。

<EditText
    android:id="@+id/login_edt_user_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Username" />

<EditText
    android:id="@+id/login_edt_password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/login_edt_user_name"
    android:hint="Password"
    android:inputType="textPassword" />

<Button
    android:id="@+id/login_btn_sign_in"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{() -> login.onLogin(loginEdtUserName.getText(), loginEdtPassword.getText())}"
    android:layout_below="@+id/login_edt_password"
    android:text="SIGN IN" />

答案 2 :(得分:0)

+ id使用“ login_edt_user_name”格式时,存在一些冲突。确保标识符使用camelCase以便可以正确访问它们:

正确:

android:onClick="@{() -> login.onLogin(loginEdtUserName.getText(), loginEdtPassword.getText())}"

错误:

android:onClick="@{() -> login.onLogin(login_edt_user_name.getText(), login_edt_password.getText())}"