是否可以从 xml 视图向绑定事件发送参数

is this possible to send parameters to binding events from xml views

我正尝试在 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>

提前致谢。

这可以使用双向数据绑定解决(自 Gradle 插件的 2.1 版起可用)。

备选方案 1:

在您的 XML 中导入 android.view.View

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

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

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)}"

当您将 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" />

+id 使用"login_edt_user_name" 格式时存在一些冲突。确保标识符使用驼峰式命名,以便可以正确访问它们:

正确:

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

错误:

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