是否可以从 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())}"
我正尝试在 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())}"