Android 无法使用数据绑定在viewmodel中绑定textwatcher

Android 无法使用数据绑定在viewmodel中绑定textwatcher,android,android-fragments,android-databinding,android-mvvm,android-mvp,Android,Android Fragments,Android Databinding,Android Mvvm,Android Mvp,我正在尝试使用mvvm模式实现数据绑定。我有一个textwatcher,我需要设置textviews的可视性true和false,还需要根据edittext字符的长度更改视图的背景。下面是我如何实现它的,但没有成功 我在其中实现绑定的XML编辑文本 <com.google.android.material.textfield.TextInputLayout android:id="@+id/etPasswordLayout"

我正在尝试使用mvvm模式实现数据绑定。我有一个textwatcher,我需要设置textviews的可视性true和false,还需要根据edittext字符的长度更改视图的背景。下面是我如何实现它的,但没有成功

我在其中实现绑定的XML编辑文本

<com.google.android.material.textfield.TextInputLayout
                        android:id="@+id/etPasswordLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="5sp"
                        android:gravity="center_vertical"
                        app:passwordToggleEnabled="true">

                        <EditText
                            android:id="@+id/password"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_margin="5sp"
                            android:alpha="0.6"
                            android:drawableLeft="@drawable/ic_group"
                            android:drawablePadding="8dp"
                            android:gravity="center_vertical"
                            android:hint="@string/password"
                            android:addTextChangedListener="@{viewmodel.onPasswordTextChanged1}"
                            android:drawableStart="@drawable/ic_group"
                            android:text="@={viewmodel.password}"
                            android:inputType="textPassword"
                            android:padding="10sp" />

                    </com.google.android.material.textfield.TextInputLayout>

当我运行时,它说找不到我指定的方法。我还尝试了
android:onTextChanged

为什么调用
setContentView(R.layout.activity\u-signup)
setContentView
进行数据绑定?另一件事是,我在任何地方都看不到
数据绑定.executePendingBindings()
。有没有解决上述问题的方法?
class SignUpViewModel : ViewModel(),Callback<LoginModel> 
    {
        var password1value: MutableLiveData<LoginModel>? = null
        var password2value: MutableLiveData<LoginModel>? = null
        var email: ObservableField<String>? = null
        var password: ObservableField<String>? = null
        var repassword: ObservableField<String>? = null

        var authListener: AuthListener? = null

        var password1tv:MutableLiveData<Int>?=null

        init {
            password1value = MutableLiveData<LoginModel>()
            email = ObservableField("")
            password = ObservableField("")
            repassword = ObservableField("")
            password1tv = MutableLiveData()
        }

        fun signup() {
            authListener?.onStarted()
            if (email!!.equals("") || password!!.equals("") || repassword!!.equals("") || email === null || password == null || repassword ==null ) {
                authListener?.onFailure("Some Fields are empty or blank")
                return
            }
            WebServiceClient.client.create(Api::class.java).signup(
                email?.get()!!
                , password?.get()!!
            )
                .enqueue(this)
        }

        override fun onFailure(call: Call<LoginModel>?, t: Throwable?) {
            authListener?.onFailure(t?.message!!)
        }

        override fun onResponse(call: Call<LoginModel>?, response: Response<LoginModel>?) {
            password1value?.value = response?.body()
            authListener?.onLoginSuccess(response!!.body())

            Coroutines.main {
                try {
                    response?.body()?.let {
                        return@main
                    }
                    authListener?.onFailure(response!!.body().message!!)
                }catch(e: ApiException){
                    authListener?.onFailure(e.message!!)
                }catch (e: NoInternetException){
                    authListener?.onFailure(e.message!!)
                }
            }
        }


        fun onPasswordTextChanged1(s: CharSequence,start: Int,before : Int,
                                  count :Int){

            if (s.length<6)
            {
                password1tv?.value=1
            }
            else if (s.length>6 && s.length <8)
            {
                password1tv?.value=2
            }
            else if (s.length >8 && s.length <10)
            {
                password1tv?.value=3
            }
            else if (s.length >10)
            {
                password1tv?.value=4
            }

        }

        fun onPasswordTextChanged2(s: CharSequence,start: Int,before : Int,
                                   count :Int){

            if (s.length<6)
            {

            }
            else if (s.length>6 && s.length <8)
            {

            }
            else if (s.length >8 && s.length <10)
            {

            }
            else if (s.length >10)
            {

            }
        }

    }
class SignUpActivity : AppCompatActivity(),
    AuthListener,KodeinAware 
{
    var binding: ActivitySignupBinding? = null
    var viewmodel: SignUpViewModel? = null
    var loginSession: LoginSession?=null
    override val kodein by kodein()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_signup)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_signup)
        viewmodel = ViewModelProviders.of(this).get(SignUpViewModel::class.java)
        binding?.viewmodel = viewmodel

        viewmodel?.authListener = this
        loginSession= LoginSession(this)

        //viewmodel?.getPasswordQuality()

        initiatewatch()

    }

    override fun onStarted() {
        progress_bar.isVisible=true
    }

    override fun onLoginSuccess(loginModel: LoginModel) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }


    override fun onSignUpSuccess(loginModel: LoginModel) {
        progress_bar.isVisible=false
        Toast.makeText(this, loginModel?.message, Toast.LENGTH_LONG).show()

        if (loginModel.user_id!=null)
        {
            loginSession?.createLoginSession(loginModel)
        }    }

    override fun onFailure(message: String) {
        progress_bar.isVisible=false
        Toast.makeText(this,  message, Toast.LENGTH_LONG).show()
        // root_layout.snackbar(message)
    }

    fun initiatewatch()
    {

        viewmodel?.password1tv?.observe(this, Observer { it ->

            when(it)
            {
                1->
                {
                    password_weak_tv.visibility= View.VISIBLE
                }
                2 ->
                {
                    password_medium_tv.visibility= View.VISIBLE
                    password_weak_tv.visibility= View.GONE
                    password_medium_tv.setBackgroundDrawable(resources.getDrawable(R.drawable.password_strenth_medium))
                    password_strong_tv.visibility= View.GONE
                    password_very_strong_tv.visibility= View.GONE
                }
                3->
                {
                    password_medium_tv.visibility= View.GONE
                    password_weak_tv.visibility= View.GONE
                    password_medium_tv.setBackgroundDrawable(resources.getDrawable(R.drawable.password_strenth_strong))
                    password_strong_tv.visibility= View.VISIBLE
                    password_very_strong_tv.visibility= View.GONE                }
                4->
                {
                    password_medium_tv.visibility= View.GONE
                    password_weak_tv.visibility= View.GONE
                    password_very_strong_tv.setBackgroundDrawable(resources.getDrawable(R.drawable.password_strenth_vstrong))
                    password_strong_tv.visibility= View.GONE
                    password_very_strong_tv.visibility= View.VISIBLE
                }
            }
        })
    }
}