Android 无法使用数据绑定在viewmodel中绑定textwatcher
我正在尝试使用mvvm模式实现数据绑定。我有一个textwatcher,我需要设置textviews的可视性true和false,还需要根据edittext字符的长度更改视图的背景。下面是我如何实现它的,但没有成功 我在其中实现绑定的XML编辑文本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"
<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
}
}
})
}
}