我正在创建一个带有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) {}
}
问题是你试图从你在etOne
上收到的视图中选择etTwo
,etThree
,etFour
和TextWatcher
。您在函数afterTextChanged(s: Editable?)
中访问的视图已经是您愿意使用requestFocus()
的editTexts。
您正在访问的视图是您拥有的4个TextView
s之一。您需要更改此处的逻辑才能访问其他TextView
s
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。