如何解决 edittext 递归问题?

how can I solve edittext recursion problem?

我试图在 edittextview 中实现实时字体更改 基于降价语法 我做的第一个代码是

my_edit_text_view.text = makeMDStyleSpannable(my_edit_text_view.text)//returns spannableString

但运气不好,因为每次更改文本时它都不会调用

所以我又试了一次,在我跳转之前创建监听器并测试一切是否正常工作

my_edit_text_view.text = doOnTextChanged { it, start, count,after ->
            if (it != null) {
                if(it.isNotEmpty()){
                    Toast.makeText(this, (makeMDStyleSpannable(it)), Toast.LENGTH_SHORT).show()
     
                }else if(it.isNullOrEmpty()){

                }

            }
        }

因为 result 它适用于另一个 TOAST

然而,真正重复发生的事情是这样的

my_edit_text_view.text = doOnTextChanged { it, start, count,after ->
            if (it != null) {
                if(it.isNotEmpty()){
                   my_edit_text_view.text = (makeMDStyleSpannable(it)
                }else if(it.isNullOrEmpty()){

                }

            }
        }

umm,实际发生的是当 edittext 上有外部文本更改(键盘)时它调用 makeMDStyleSpannable 并且这应用内部更改然后它会一次又一次地调用 doOnTextChanged,终于崩溃了。 我该如何解决这个问题?

keyboard(onText added[external]) => startThelistner => makeMDStyleSpannable[in]
                                     /\                    ||
                                     ||=====[infinite]=======

谢谢

您可以通过添加一个布尔值来检查文本是否被用户或代码更改来解决。

val shouldIgnoreChange = false
my_edit_text_view.text = doOnTextChanged { it, start, count,after ->
        if (it != null) {
            if(it.isNotEmpty()){
               if(!shouldIgnoreChange){
                   shouldIgnoreChange = true
                   my_edit_text_view.text = (makeMDStyleSpannable(it)
                   shouldIgnoreChange = false
               }
            }else if(it.isNullOrEmpty()){

            }

        }
    }