15

我有一个简单的登录表单,用户可以在其中输入用户名和密码,然后点击登录按钮。

我有我的布局文件,类似于这样的activit_main.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="user"
            type="User"></variable>
<variable
            name="logInResponse"
            type="LogInResponse"></variable>
    </data>
<LinearLayout
            android:id="@+id/login_section_credentialsBody"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:hint="@{user.username}" />

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@{user.password}" />

           <Button
                android:id="@+id/login"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Log In"
                android:onClick="callLogIn"/>


        </LinearLayout>
</Layout>

这是我的 MainActivity.java:

 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
            User user = new User("Log In","Password");
            binding.setUser(user);
        }

    public void callLogIn(View view) {
            ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
    textView.setText("Connecting...");
            loginInService.checkLogin(binding.getUser());
        }

问题是它第一次在我创建它的编辑文本中显示登录和密码并将其绑定在 OnCreate 中,但是当用户输入实际的用户名和密码时,它不会采用用户输入的新值。

那么如何获取用户输入的文本呢?

4

5 回答 5

22

根据George 和 Yigit 的 Google I/O 2016数据绑定演讲,您可以:

android:text="@={User.LogIn}

在你的 xml 中,这两种方式都可以。需要注意的是附加的等号。

于 2016-05-28T02:15:23.413 回答
13

您将需要在您的用户(视图模型)中有功能,您可以在其中传递字段数据。例如下面是我的登录活动布局文件代码。

<EditText android:layout_width="0dp"
              android:id="@+id/email_address_input"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintTop_toTopOf="parent"
              android:hint="Email address"
              android:gravity="center"
              android:layout_height="wrap_content"/>

    <EditText android:layout_width="0dp"
              android:id="@+id/password_input"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintTop_toBottomOf="@id/email_address_input"
              android:hint="Password"
              android:gravity="center"
              android:layout_height="wrap_content"/>

    <Button android:layout_width="wrap_content"
            android:id="@+id/submit"
            android:text="Submit"
            android:onClick="@{()->viewModel.onClickEmailSignin(emailAddressInput.getText().toString(),passwordInput.getText().toString())}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/password_input"
            android:layout_height="wrap_content"/>

这是我的视图模型具有 onClickEmailSignin() 功能

fun onClickEmailSignin(email: String, password: String) {
   Log.d(LOG_TAG, "email $email password : $password");
}
于 2019-01-15T04:58:28.127 回答
5

目前 android 数据绑定是一种通信方式,因此它不允许像您期望的那样获取 edittext 当前文本。

我遇到了同样的问题,在阅读了谷歌官方文档后,我得到了这个:

MyLayoutBinding binding=DataBindingUtil.setContentView(this,R.layout.my_layout);

现在使用此绑定对象来获取对您的视图的引用。假设您有 edittext 作为

 <EditText
            android:id="@+id/edittext_chat_message"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:hint="@string/hint_typing"
            android:layout_marginRight="@dimen/margin_average"
            style="@style/regular_editTexts"/>

然后通过以下方式获取对edittext的引用binding.edittextChatMessage.getText().toString

难怪数据绑定本身使用它的 id 名称为您创建了 edittext 引用,与 findViewById 方法相比,这种获取引用的方式也非常快。

于 2017-09-03T11:05:03.657 回答
1

你不能。

目前,Android 数据绑定只是一种方式。

因此,当您设置 android:text="@{user.username}" 时,会将 EditText 的文本设置为用户的当前用户名。如果用户或用户名是可观察的,那么如果它们发生变化,您也会得到更新。

然而,这只是一种方式——EditText 将显示对视图模型的更新,但视图模型不会获得对 EditText 的更改。

如果您想要这些更改,则必须手动进行。

这里有两种简单的方法,这取决于您的用例。一,设置一个 TextWatcher 并保持名称更新。

另一个,我认为这是您在这里需要的,是在 callLogIn 方法中手动更新它。

另外,请参阅https://medium.com/@fabioCollini/android-data-binding-f9f9d3afc761 它有点复杂,但它可能适合您的用例。

于 2015-09-25T17:41:52.953 回答
0

EditText使用时不能直接获取文本VieBind,解决这个问题可以使用TextWatcher方法获取文本

看到这个小代码:

      val binding = MyActvityBinding.inflate(layoutInflater)
      setContentView(binding.root)

      val text : String = ""
      binding.editText.addTextChangedListener {
        text = it.toString()
    }

   Log.d("EditText",text)
于 2020-12-19T08:56:33.350 回答