问题描述
我正在使用 datetime_cols= pd.to_datetime(df.columns,dayfirst=True,errors='coerce')
out = (df.loc[:,(datetime_cols.year == year) & (datetime_cols.month == month)]
.reset_index())
来预设文本或让用户输入内容。我想让它“全部大写”,所以我为我的 EditText
实现了大写功能。
您可以使用此 TextWatcher
进入和离开屏幕,并且 EditText
多次来回切换屏幕 - 这意味着我必须从 {{1} 正确注册和注销 TextWatcher
} 在屏幕进入/离开事件时。
我注意到,如果我连续多次进入和离开屏幕,在第 5 次进入时,我的整个应用程序都被冻结了 - 所以有些东西阻塞了 UI 线程。
经过深入调查,我发现如果我调用 TextWatcher
,它会多次触发我的 EditText
侦听器。在第 5 次进入时,它像 连续 50 次 那样触发它并导致 UI 线程阻塞。
这是如何修复的,还是 Android 方面的错误?
代码: 进入时初始化屏幕:
editText.setText("some string")
All-Cap 转换功能(不应触发 TextWatcher)
afterTextChanged
离开前清屏:
initEditTextListener()
App.log("FormScreen - setData")
formFirstEt?.setText(item.name)
private var inputWatcher: TextWatcher? = null
private fun initEditTextListener(){
formFirstEt?.onEditorAction{
formInputValidation(this.text.toString(),formFirstEt,App.getString("form_empty"),App.getString("form_empty_reason"))
validateData()
formSecondEt?.let { s -> if (s.isEnabled) s.requestFocus() }
}
inputWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
App.log("FormScreen - initEditTextListener - afterTextChanged")
validateData()
}
override fun beforeTextChanged(s: CharSequence?,start: Int,count: Int,after: Int) {}
override fun onTextChanged(s: CharSequence?,before: Int,count: Int) {
App.log("FormScreen - initEditTextListener - onTextChanged")
validateData()
formFirstEt?.let { et -> onFormFirstInputChanged(s.toString(),this,et)}
}
}
inputWatcher?.let {formFirstEt?.addTextChangedListener(it)}
}
日志:
fun onFormFirstInputChanged(s: String,tv: TextWatcher,et: EditText) {
et.removeTextChangedListener(tv)
if (isFirstInputValid(s)) {
with(et) {
text.clear()
append(s.toupperCase(Locale.getDefault()))
setSelection(s.length)
}
} else {
val substring = s.substring(0,s.length - 1)
with(et) {
text.clear()
append(substring.toupperCase(Locale.getDefault()))
setSelection(substring.length)
}
}
et.addTextChangedListener(tv)
}
更新:
这是 Kotlin 的一些行为。问题出在 formFirstEt?.setText("")
inputWatcher?.let { formFirstEt?.removeTextChangedListener(it) }
inputWatcher = null
上,我预计它会向 -- First time screen enter ---
2021-01-14 11:24:50.324 1136-1136/? I/Project: FormScreen - setData
2021-01-14 11:24:50.458 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:50.460 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
2021-01-14 11:24:52.838 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:52.841 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
-- Second time screen enter --
2021-01-14 11:24:56.324 1136-1136/? I/Project: FormScreen - setData
2021-01-14 11:24:56.366 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:56.367 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:56.368 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
2021-01-14 11:24:56.368 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:56.369 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
2021-01-14 11:24:56.369 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:56.370 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:56.370 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
2021-01-14 11:24:56.371 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged
2021-01-14 11:24:56.372 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
2021-01-14 11:24:56.372 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
2021-01-14 11:24:56.373 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged
添加空字符串,但显然它正在添加字符终止符。 Kotlin 无法识别它的 formFirstEt?.setText("")
但它的 EditText
默认以 String
字符结尾。这个字符数组在本机 char array
函数中触发了一些奇怪的行为,这是垃圾邮件 \0
修复:
setText
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)