Привязка данных Android - невозможно вызвать обработчик кликов

Я создал простой экран входа в систему, используя привязку данных, как описано на странице http://developer.android.com/tools/data-binding/guide.html однако я не могу получить уведомление об изменении текста с

  1. текстовое поле или
  2. щелчок кнопки.

Я думаю, что для уведомления в текстовом поле команда Android, возможно, не реализовала его полностью. Однако я не понимаю своей ошибки для обработчика нажатия кнопки.

Код фрагмента выглядит так

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    FragmentAccountSetupInitialBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_account_setup_initial, container, false);
    View view = binding.getRoot();

    binding.setAccount(new UserAccount());
    return view;
}

Модель ViewModel для учетной записи пользователя определена ниже.

public class UserAccount extends BaseObservable {
    private String _email;
    private String _password;

    @Bindable
    public String getEmail() {
        return _email;
    }

    public void setEmail(String email) {
        if(!TextUtils.equals(_email, email)) {
            _email= email;
            notifyPropertyChanged(BR.email);
        }
    }


    @Bindable
    public String getPassword() {
        return _password;
    }

    public void setPassword(String password) {
        if(!TextUtils.equals(_password, password)) {
            _password = password;
            notifyPropertyChanged(BR.password);
        }
    }

    public void onSignInButtonClick(View view) {
        // Sign in now
    }
}

И макет фрагмента

<layout
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="account" type="project.namespace.UserAccount"/>
    </data>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="56dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <!-- Email Label -->
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp">
                <android.support.design.widget.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textEmailAddress"
                    android:hint="@string/email"
                    android:text="@{account.email}"/>
            </android.support.design.widget.TextInputLayout>

            <!-- Password Label -->
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp">
                <android.support.design.widget.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPassword"
                    android:hint="@string/password"
                    android:text="@{account.password}"/>
            </android.support.design.widget.TextInputLayout>


            <android.support.v7.widget.AppCompatButton
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="24dp"
                android:layout_marginBottom="24dp"
                android:padding="12dp"
                android:text="@string/signin"
                android:onClick="@{account.onSignInButtonClick}"/>

        </LinearLayout>

    </FrameLayout>
</layout>

Обновить

Переход на Android Studio 2.1 beta 2 решает первую проблему. Обновил макет следующим образом

<android.support.design.widget.TextInputEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textEmailAddress"
    android:hint="@string/email"
    android:text="@={account.email}"/>

person resp78    schedule 18.04.2016    source источник
comment
перейдите по этой ссылке обработчик onClick, вы можете найти решение этого вопроса.   -  person Sandeep_Devhare    schedule 18.04.2016
comment
Я думаю, что это именно то, что я делаю. Вместо отдельного класса MyHandler я обрабатываю его в классе UserAccount.   -  person resp78    schedule 18.04.2016
comment
В настоящее время привязка данных доступна только one way. Таким образом, только изменения в вашей модели уведомляют о представлении, а не наоборот. Эта функция появилась в Android Studio 2.1(Источник. Ваш код выглядит нормально, не могли бы вы объяснить свою проблему подробнее? Ваш метод onClick вызывается?   -  person yennsarah    schedule 18.04.2016
comment
Спасибо за обновление двусторонней привязки. Если бы официальные документы упомянули, это сэкономило бы мне время. Спасибо за обновление 2.1. Нет onClick не звонят   -  person resp78    schedule 18.04.2016
comment
Я обновился до Android Studio 2.1, и сеттеры работают, но с onClick все еще не повезло.   -  person resp78    schedule 18.04.2016


Ответы (2)


Можете ли вы попробовать следующее для своей кнопки?

<android.support.v7.widget.AppCompatButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:layout_marginBottom="24dp"
            android:padding="12dp"
            android:text="@string/signin"
            android:onClick="@{account::onSignInButtonClick}"/>

Я получаю сообщение об ошибке в среде IDE ('!=', '%'... expected, got ':'), но оно работает, когда приложение запущено... Важной частью является "::".

Надеюсь, это поможет вам!

person Gavin Harris    schedule 29.08.2016

Насколько мне известно, событие onClick не работает во фрагменте, и я не понимаю, почему. Попробуйте использовать аннотацию BindingAdapter для определения пользовательского установщика.

person Yelin Wu    schedule 18.05.2016