android - 双向绑定(bind)无法解析 setter

标签 android android-studio android-layout android-databinding android-mvvm

我正在尝试了解数据绑定(bind),我有我的 CreditCardViewModel 类,它在我的 fragment 中绑定(bind)如下

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}"

The expression 'creditCardViewModel.getCvv()' cannot be inverted, so it cannot be used in a two-way binding

Details: Two-way binding cannot resolve a setter for java.lang.Integer property 'cvv'

我尝试在 viewModel 中添加 getter 和 setter 以正确获取属性,但仍然收到错误。

最佳答案

Make it your private variable to the public in your 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)}"

关于android - 双向绑定(bind)无法解析 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57799087/

相关文章:

添加 com.google.android.material 后,Android 底部导航栏颜色变为黑色

android - 在 Android 上使用 FFmpeg 以错误的速度播放音频

ubuntu - 在 ubuntu 15.04 上安装 android studio 期间无法运行 mksdcard 工具

Android studio - play store - 上传失败 - 图标无效

android - 如何在android中的网格中显示图像?

java - 如何在android中部分改变文本的颜色

java - 使用 For 循环将多个 Drawable 存储在 ArrayList 中

android - 如何将 android 测试设备添加到 Firebase?

java - 应用程序中未显示菜单

android - 以编程方式更改布局的背景颜色