Двусторонняя привязка не может разрешить сеттер

Я пытаюсь узнать о привязке данных. У меня есть класс CreditCardViewModel, который привязан к моему fragment следующим образом

public class CreditCardValidatorFragment extends Fragment {

private CreditCardViewModel cardViewModel;
private CcValidateFragmentBinding binding;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    binding = DataBindingUtil.inflate(inflater, R.layout.cc_validate_fragment, container, false);
    return binding.getRoot();
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    cardViewModel = ViewModelProviders.of(this).get(CreditCardViewModel.class);
    binding.setCreditCardViewModel(cardViewModel);
    binding.submitButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Navigation.findNavController(view).navigate(CreditCardValidatorFragmentDirections.actionMainFragmentToSecondFragment("Arvinder"));
        }
    });
    //required to update UI with Live data
    binding.setLifecycleOwner(this);

}

}

public class CreditCardViewModel extends ViewModel {
private MutableLiveData<String> firstName = new MutableLiveData<>();
private MutableLiveData<String> lastName = new MutableLiveData<>();
private MutableLiveData<Long> ccNumber = new MutableLiveData<>();
private MutableLiveData<Integer> ccType = new MutableLiveData<>();
private MutableLiveData<String> exp = new MutableLiveData<>();
private MutableLiveData<Integer> cvv = new MutableLiveData<>();

public String getFirstName() {
    return firstName.getValue();
}

public String getLastName() {
    return lastName.getValue();
}

public Long getCcNumber() {
    return ccNumber.getValue().longValue();
}

public Integer getCcType() {
    return ccType.getValue();
}

public String getExp() {
    return exp.getValue();
}

public Integer getCvv() {
    return cvv.getValue();
}

public void onCvvTextChanged(CharSequence text) {
    cvv.setValue(Integer.valueOf(text.toString()));
}

public void onFirstNameChanged(CharSequence text) {
    firstName.setValue(text.toString());
}

public void onLastNameChanged(CharSequence text) {
    lastName.setValue(text.toString());
}

public void onCCNumberChanged(CharSequence text) {
    ccNumber.setValue(Long.valueOf(text.toString()));
}

public void onExpChanged(CharSequence text) {
    exp.setValue(text.toString());
}

public void onCCTypeChanged(CharSequence text) {
    ccType.setValue(Integer.valueOf(text.toString()));
}
}

Часть моего макета

<EditText
            android:id="@+id/cvvEdit"
            android:layout_width="wrap_content"
            android:layout_height="48dp"
            android:layout_marginStart="36dp"
            android:layout_marginLeft="36dp"
            android:layout_marginTop="24dp"
            android:afterTextChanged="@{(text) -> creditCardViewModel.onCvvTextChanged(text)}"
            android:ems="10"
            android:inputType="number"
            android:text="@={creditCardViewModel.cvv}"
            app:layout_constraintStart_toEndOf="@+id/cvv"
            app:layout_constraintTop_toBottomOf="@+id/expirationEdit" />

Я получил следующую ошибку при попытке установить cvv в моем макете:

  android:text="@={creditCardViewModel.cvv}"

Выражение creditCardViewModel.getCvv() не может быть инвертировано, поэтому его нельзя использовать в двусторонней привязке.

Подробности: двусторонняя привязка не может разрешить установщик для java.lang.Integer свойства cvv

Я попытался добавить геттеры и сеттеры в viewModel, чтобы правильно получить свойство, но все равно получаю ошибку.


person luckysing_noobster    schedule 05.09.2019    source источник
comment
Подумайте о добавлении сеттера для ваших cvv liveata. Помните, что вы не входите в бесконечный цикл (т.е. устанавливая одни и те же значения снова и снова)   -  person Jeel Vankhede    schedule 05.09.2019


Ответы (1)


Сделайте это своей частной переменной для публичного доступа в вашей ViewModel

public MutableLiveData<String> firstName = new MutableLiveData<>();
public MutableLiveData<String> lastName = new MutableLiveData<>();
public MutableLiveData<Long> ccNumber = new MutableLiveData<>();
public MutableLiveData<Integer> ccType = new MutableLiveData<>();
public MutableLiveData<String> exp = new MutableLiveData<>();
public MutableLiveData<Integer> cvv = new MutableLiveData<>();

И вам нужно преобразовать целое число в строку

android:text="@={String.valueOf(creditCardViewModel.cvv)}"
person Akshay Raiyani    schedule 05.09.2019