ユーザーがユーザー名とパスワードを入力し、ボタンを押してログインできる簡単なログインフォームがあります。
この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でバインドしたときに、編集テキストにログインとパスワードが初めて表示されることですが、ユーザーが実際のユーザー名とパスワードを入力すると、ユーザーが入力した新しい値が取得されません。
では、ユーザーが入力したテキストを取得するにはどうすればよいですか?
GeorgeとYigitのGoogleI/O 2016データバインディングトークによると、次のことができます。
Android:text = "@ = {User.LogIn}
あなたのxmlと双方向で動作します。注意すべきことは、追加の等号です。
フィールドデータを渡すことができるユーザー(ビューモデル)の関数が必要になります。たとえば、以下はログインアクティビティのレイアウトファイルコードです。
<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");
}
現在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メソッドと比較して非常に高速です。
できません。
現在、Androidデータバインディングは一方向のみです。
したがって、Android:text = "@ {user.username}"を設定すると、そのEditTextのテキストがユーザーの現在のユーザー名に設定されます。ユーザーまたはユーザー名が監視可能である場合、それらが変更された場合にも更新を取得します。
ただし、これは1つの方法のみです。EditTextはビューモデルの更新を表示しますが、ビューモデルはEditTextの変更を取得しません。
これらの変更が必要な場合は、手動で行う必要があります。
ここには2つの簡単な方法があり、ユースケースによって異なります。 1つは、TextWatcherを設定し、名前を最新の状態に保ちます。
もう1つは、ここで必要になると思いますが、callLogInメソッドで手動で更新することです。
また、 https://medium.com/@fabioCollini/Android-data-binding-f9f9d3afc761 を参照してください。少し複雑ですが、ユースケースに合う可能性があります。