android - 使用 Android 数据绑定(bind)在 EditText text.length() > 0 时启用按钮

标签 android mvvm data-binding android-databinding android-viewmodel

当有人开始在 EditText 中写作时,我正在尝试启用该按钮。

我将 Button 的 enabled 属性设置为 安卓:启用 ="@{editText.text.length() > 0}"

这运作良好。但是当我尝试使用两种方式 DataBinding 将 EditText 绑定(bind)到 ViewModel 时,它停止了工作。

正是这条线造成了不同。

            android:text="@={signUpViewModel.Phone}"

没有这个,它工作正常!可能是什么原因?

以下是完整的 XML。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>
    <variable
        name="signUpViewModel"
        type="com.qenetech.africapuzzle.signup.SignUpViewModel" />

    <variable
        name="editText_verify_phone_number"
        type="android.widget.EditText" />
</data>

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".signup.verify_phone.EnterPhoneFragment">

    <Spinner
        android:id="@+id/spinner_country"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="60dp"
        android:layout_marginEnd="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:gravity="center"
        android:orientation="horizontal"
        android:weightSum="10"
        app:layout_constraintEnd_toEndOf="@+id/spinner_country"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/spinner_country"
        app:layout_constraintTop_toBottomOf="@+id/spinner_country">



        <android.support.design.widget.TextInputLayout
            android:layout_width="0dp"
            android:layout_weight="2"
            android:layout_height="wrap_content"
            android:textColorHint="@android:color/darker_gray">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/editText_verify_phone_country_code"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ems="10"
                android:text="@={signUpViewModel.CountryCode}"
                android:inputType="phone" />

        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/etPhoneLayout"
            android:layout_width="0dp"
            android:layout_weight="8"
            android:layout_height="wrap_content"
            android:textColorHint="@android:color/darker_gray">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/editText_verify_phone_number"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@={signUpViewModel.Phone}"
                android:hint="@string/enter_phone_number"
                android:inputType="phone"/>

        </android.support.design.widget.TextInputLayout>
    </LinearLayout>

    <Button
        style="@style/Button.Primary"
        android:id="@+id/button_verify_phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="@string/next"
        android:textSize="@dimen/text_medium"
        android:enabled="@{editTextVerifyPhoneNumber.text.length() > 0}"
        app:layout_constraintEnd_toEndOf="@+id/linearLayout"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="@+id/linearLayout"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout" />
</android.support.constraint.ConstraintLayout>
</layout>

下面是 ViewModel
public class SignUpViewModel extends ViewModel {

    public MutableLiveData<String> Phone = new MutableLiveData<>();
    public MutableLiveData<String> CountryCode = new MutableLiveData<>();
}

以及我与 ViewModel 一起使用的 fragment
public class EnterPhoneFragment extends Fragment {

    private SignUpViewModel signUpViewModel;

    private SignupEnterPhoneFragmentBinding binding;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        binding = DataBindingUtil.inflate(inflater, R.layout.signup_enter_phone_fragment, container, false);

        View root = binding.getRoot();

        signUpViewModel = ViewModelProviders.of(this).get(SignUpViewModel.class);

        binding.setSignUpViewModel(signUpViewModel);

        Spinner spinner = root.findViewById(R.id.spinner_country);

        spinner.setAdapter(new CountrySpinnerAdapter(getContext()));

        return root;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

}

最佳答案

使用TextUtils确定是否启用按钮。

将此添加到布局中

<data>
    <variable
        name="signUpViewModel"
        type="com.qenetech.africapuzzle.signup.SignUpViewModel" />

    <import type="android.text.TextUtils" />
</data>

然后
<Button
    style="@style/Button.Primary"
    android:id="@+id/button_verify_phone"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="40dp"
    android:text="@string/next"
    android:textSize="@dimen/text_medium"
    android:enabled="@{!TextUtils.isEmpty(signUpViewModel.phone)}"
    app:layout_constraintEnd_toEndOf="@+id/linearLayout"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintStart_toStartOf="@+id/linearLayout"
    app:layout_constraintTop_toBottomOf="@+id/linearLayout" />

也别忘了打电话
binding.setLifecycleOwner(this)

onViewCreated .

关于android - 使用 Android 数据绑定(bind)在 EditText text.length() > 0 时启用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57227979/

相关文章:

android - 如何在android中使用数据绑定(bind)实现Switch

java - 位图到 byte[] 到位图(不压缩)

Android minSdkVersion

.net - 允许调整大小,同时将缩放比例保持在Window上

asp.net - 将 Eval 与 Sum() 和 Count() 与 ASP.Net EntityFramework 和 ListView 一起使用

android - 如何在android中的DataBinding中使用内部布局

java - Android 使用哪种协议(protocol)将其屏幕转换到 Chrome Cast 等其他设备

c# - 将控件/UIElement 可见性正确且正确地绑定(bind)到 Property MVVM C#​​ WPF

wpf - 已添加具有相同键的项目错误

c# - 如何将 ObservableCollection<LineSeries> 绑定(bind)到图表