web-dev-qa-db-ja.com

Androidデータバインディングユーザーが入力したテキストを取得してコードで取得する方法

ユーザーがユーザー名とパスワードを入力し、ボタンを押してログインできる簡単なログインフォームがあります。

この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でバインドしたときに、編集テキストにログインとパスワードが初めて表示されることですが、ユーザーが実際のユーザー名とパスワードを入力すると、ユーザーが入力した新しい値が取得されません。

では、ユーザーが入力したテキストを取得するにはどうすればよいですか?

12
minal sharma

GeorgeとYigitのGoogleI/O 2016データバインディングトークによると、次のことができます。

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

あなたのxmlと双方向で動作します。注意すべきことは、追加の等号です。

12
GinsengRoses

フィールドデータを渡すことができるユーザー(ビューモデル)の関数が必要になります。たとえば、以下はログインアクティビティのレイアウトファイルコードです。

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

現在Androidデータバインディングは一方向の通信であるため、編集テキストの現在のテキストを期待どおりに取得することはできません。

私は同じ問題を抱えていました、そして公式のグーグルドキュメントを読んだ後、私はこれを手に入れました:

_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名を使用して編集テキスト参照を作成したのも不思議ではありません。また、参照を取得するこの方法は、findViewByIdメソッドと比較して非常に高速です。

3
saksham

できません。

現在、Androidデータバインディングは一方向のみです。

したがって、Android:text = "@ {user.username}"を設定すると、そのEditTextのテキストがユーザーの現在のユーザー名に設定されます。ユーザーまたはユーザー名が監視可能である場合、それらが変更された場合にも更新を取得します。

ただし、これは1つの方法のみです。EditTextはビューモデルの更新を表示しますが、ビューモデルはEditTextの変更を取得しません。

これらの変更が必要な場合は、手動で行う必要があります。

ここには2つの簡単な方法があり、ユースケースによって異なります。 1つは、TextWatcherを設定し、名前を最新の状態に保ちます。

もう1つは、ここで必要になると思いますが、callLogInメソッドで手動で更新することです。

また、 https://medium.com/@fabioCollini/Android-data-binding-f9f9d3afc761 を参照してください。少し複雑ですが、ユースケースに合う可能性があります。

1
Nacho