Я только что узнал о привязке данных в приложениях для Android и хочу реализовать EditText
TextWatcher с @BindingAdapter
, для моего кода ниже, к сожалению, я получаю эту ошибку:
Required DataBindingComponent is null in class ActivityLoginBindingImpl. A BindingAdapter in ir.instacheeta.application.views.login.viewModel.LoginViewModel.EditTextBindingAdapters is not static and requires an object to use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static.
, и я не могу разрешитьчто
binding = DataBindingUtil.setContentView(this, R.layout.activity_login);
binding.setViewModel(ViewModelProviders.of(this,
new LoginViewModelFactory(this))
.get(LoginViewModel.class));
Мой ViewModel
класс:
public class LoginViewModel extends ObservableViewModel {
private static InstagramAccount instagramAccount;
private LoginResultCallback loginResultCallback;
public LoginViewModel(LoginResultCallback callback) {
instagramAccount = new InstagramAccount();
loginResultCallback = callback;
}
public static class EditTextBindingAdapters {
@BindingAdapter(value = "textChangedListener" , requireAll = true)
public void bindTextWatcher(EditText editText, TextWatcher textWatcher) {
editText.addTextChangedListener(textWatcher);
}
}
@Bindable
public static TextWatcher getUserPageTextWatcher() {
return new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// Do nothing.
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.e("==> ", s.toString());
instagramAccount.setUserPage(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
// Do nothing.
}
};
}
@Bindable
public static TextWatcher getUserPagePassword() {
return new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.e("==> ", s.toString());
instagramAccount.setUserPassword(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
};
}
}
, а мой ObservableViewModel
класс:
open class ObservableViewModel : ViewModel(), Observable {
private val callbacks: PropertyChangeRegistry by lazy { PropertyChangeRegistry() }
override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback) {
callbacks.add(callback)
}
override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback) {
callbacks.remove(callback)
}
fun notifyChange() {
callbacks.notifyCallbacks(this, 0, null)
}
fun notifyPropertyChanged(fieldId: Int) {
callbacks.notifyCallbacks(this, fieldId, null)
}
}