Android数据绑定如何获取用户输入的文本并在代码中获取它

时间:2015-08-28 19:10:32

标签: android-databinding

我有一个简单的logIn表单,用户可以在其中输入用户名和密码,点击按钮进入LogIn。

我有我的布局文件,类似于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中绑定它,但是当用户输入实际的用户名和密码时,它不会获取用户输入的新值。 / p>

那么如何用户输入文字?

5 个答案:

答案 0 :(得分:10)

根据George和Yigit的Google I / O 2016数据绑定谈话,您可以这样做:

机器人:文本=&#34; @ = {User.LogIn}

在你的xml中,这两种方式都有效。需要注意的是额外的等号。

答案 1 :(得分:2)

您将需要在User(viewmodel)中具有可传递字段数据的功能。例如,下面是我用于登录活动的布局文件代码。

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

答案 2 :(得分:1)

目前,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"/>

然后通过binding.edittextChatMessage.getText().toString

引用edittext

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

答案 3 :(得分:0)

你不能。

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

因此,当您设置android:text =“@ {user.username}”时,会将EditText的文本设置为用户的当前用户名。如果用户或用户名是Observable,那么如果他们发生更改,您也会获得更新。

但是,它只是一种方式 - EditText将显示视图模型的更新,但视图模型不会对EditText进行更改。

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

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

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

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

答案 4 :(得分: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)