我试图在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>
提前致谢。
答案 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())}"