如何在 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 */}
)
我打算在满足输入字符串的长度后将值保存在一个文本视图中。但如果使用 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 */}
)