如何在kotlin中为多个EditText创建TextWatcher公共类?

问题描述 投票:0回答:2

我正在创建一个带有4个EditText的验证屏幕。我在Kotlin中创建了一个常见的TextWatcher子类:请参阅下面的代码(代码可能是对还是错)。

当我使用下面的代码时,它会崩溃应用程序。

view.etTwo.requestFocus()

崩溃日志

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.EditText.requestFocus()' on a null object reference
        at com.mindfulness.greece.activity.ConfirmationCodeActivity$GenericTextWatcher.afterTextChanged(ConfirmationCodeActivity.kt:123)
        at android.widget.TextView.sendAfterTextChanged(TextView.java:8007)

以下是课程:

class GenericTextWatcher(var view: View) : TextWatcher {
    override fun afterTextChanged(s: Editable?) {
        val text: String = s.toString();
        when(view.id) {
            R.id.etOne -> {
                 if(text.length==1){
                      view.etTwo.requestFocus()
                 }
            }
            R.id.etTwo -> {
                 if(text.length==1){
                     view.etThree.requestFocus()
                 }
            }
            R.id.etThree -> {
                if(text.length==1){
                     view.etFour.requestFocus()
                }
            }
             R.id.etFour -> {}

                }
            }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
}
android kotlin android-edittext textwatcher
2个回答
0
投票

问题是你试图从你在etOne上收到的视图中选择etTwoetThreeetFourTextWatcher。您在函数afterTextChanged(s: Editable?)中访问的视图已经是您愿意使用requestFocus()的editTexts。

您正在访问的视图是您拥有的4个TextViews之一。您需要更改此处的逻辑才能访问其他TextViews


0
投票

view.etTwo为null,因为view是您当前正在编辑的EditText,并且它不包含所有其他edittexts。

您可以调用view.getParent()列出父级中的所有视图,找到下一个视图并关注它。很多工作!

或者为了使它更通用,你可以扩展EditText像这样:

fun EditText.onTextChange(onAfterTextChanged: OnAfterTextChangedListener) {
    addTextChangedListener(object :TextWatcher{
        private var text = ""

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit

        override fun afterTextChanged(s: Editable?) {
            if (s?.length == 1) {
                onAfterTextChanged.complete()
            }
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
    })
}

interface OnAfterTextChangedListener {
    fun complete ()
}

然后在您拥有edittexts的活动中,调用以下内容:

etOne.onTextChange(object: OnAfterTextChangedListener {
    override fun complete() {
        etTwo.requestFocus()
    }
})

etTwo.onTextChange(object: OnAfterTextChangedListener {
    override fun complete() {
        etThree.requestFocus()
    }
})

这在EditText中创建了一个名为onTextChange的新方法(可以调用任何方法)。此方法会在您的Activity中回调您的OnAfterTextChangedListener,您可以访问所有edittexts。如果文本的长度等于1,它将被调用afterTextChanged。

© www.soinside.com 2019 - 2024. All rights reserved.