我有一个带有一个EditText
和一个按钮的对话框。这EditText
将命名我将创建的数据库表,因此对其进行验证至关重要。所以我想提出2个问题:
1)这很简单,但我在任何地方都找不到:数据库表名可以接受哪些字符?它可以接受数字吗?数字可以是第一个字符吗?
2)我已经成功验证了EditText
using TextWtacher
。这是代码:
et_name.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
String filtered_str = s.toString();
if (filtered_str.matches(".*[^a-z^0-9].*")) {
filtered_str = filtered_str.replaceAll("[^a-z^0-9]", "");
s.clear();
// s.insert(0, filtered_str);
Toast.makeText(context,
"Only lowercase letters and numbers are allowed!",
Toast.LENGTH_SHORT).show();
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
目前,如果用户插入小写字母和数字以外的任何字符,文本框将被清除。如果我取消注释s.insert(0, filtered_str);
以将 EditText 替换为过滤后的字符串,我的应用程序将挂起。猜猜我在调试中发现了什么?
错误/AndroidRuntime(2454):java.lang.StackOverflowError
=D
问题是...如何替换 s 文本?
-> s.replace(0, s.toString().length(), filtered_str);
(当然,删除 s.clear)似乎也不起作用。