如何在 afterTextChanged 中保存 Editable 的值?

how to save Editable s value in afterTextChanged?

我打算在满足输入字符串的长度后将值保存在一个文本视图中。但如果使用 textview 的值,则保存的值为空。如果使用 afterTextChanged 中的 Editable s 值,会导致崩溃。

部分代码如下: number = (EditText) findViewById(R.id.number); final String numberStr = number.getText().toString();

如果使用以下 afterTextChanged,即使我已经输入了某事,也会保存空值。

  @Override
  public void afterTextChanged(Editable s) {
            if (s.length() == 11) {
                Toast.makeText(MainActivity.this, numberStr , Toast.LENGTH_SHORT).show();
                saveSettingNote(MainActivity.this, "number_save", "number", numberStr);
                number.setText(getSettingNote(MainActivity.this,"number_save", "number"));
            } 
        }

如果使用以下代码,会导致崩溃:

   @Override
   public void afterTextChanged(Editable s) {

            if (s.length() == 11) {
                Toast.makeText(MainActivity.this, s.toString(), Toast.LENGTH_SHORT).show();
                saveSettingNote(MainActivity.this, "number_save", "number", s.toString());
                number.setText(getSettingNote(MainActivity.this,"number_save", "number"));
            } 
        }

保存和获取基于SharedPreferences,在其他情况下效果很好。

实际上,我想实现的是在输入字符串满足条件后保存字符串。

请帮助找出上面代码中的错误或建议一个新的功能来获得该功能。非常感谢。

您在 edittext afterTextChanged(Editable s) 中设置了文本,它一次又一次地调用文本更改侦听器并导致应用程序崩溃。在文本更改侦听器外部调用 number.setText(getSettingNote(MainActivity.this,"number_save", "number"));

我猜想通过像您那样声明 numberStr,您希望每次编辑文本更改其内容时更改它的值。然而,这种情况并非如此;它将用空字符串 "" 初始化(除非您当时在编辑文本中没有任何其他字符串)然后它将永远不会更改其值,从而导致您保存的空值。作为解决方案,我建议在每次显示 Toast.

之前,使 numberStr 成为非最终值并更新其值(就像你已经做过的那样)

您的应用程序正在崩溃,因为您的侦听器正在无限循环,一遍又一遍地传递相同的值。

丑陋的事实是你必须取消绑定你的侦听器,设置值然后再次绑定它:

@Override
   public void afterTextChanged(Editable s) {
            if (s.length() == 11) {
                // unbind your listener
                editText.addTextChangedListener(null);

                // do your stuff
                Toast.makeText(MainActivity.this, s.toString(), Toast.LENGTH_SHORT).show();
                saveSettingNote(MainActivity.this, "number_save", "number", s.toString()); 
                number.setText(getSettingNote(MainActivity.this,"number_save", "number"));

                // bind your listener again
                editText.addTextChangedListener(MainActivity.this);
            } 
        }

使用RxBinding你可以用更优雅的方式实现:

RxTextView.textChanges(editText)
            .map { it.toString() }
            .filter({ it.length == 11 })
            .distinctUntilChanged() // <-- the important part
            .subscribe(
                { s -> /* do your stuff here */}
            )