我有一个EditText
字段,变量名valueInputField
。
我听的是文本输入的变化,我想要实现的是在输入过程中,当输入格式DOESN&T匹配正则表达式时,我想停止显示更多输入,但保持字段聚焦和放大。用户能够在键盘上键入,只是不会对该字段产生任何实际效果。
@OnTextChanged(R.id.value_input)
protected void onTextChanged(CharSequence charSequence) {
String inputChars = charSequence.toString().trim();
// if doesn't match regular expression, stop showing more inputs
if (!inputChars.matches(MY_REGEXP)) {
// this doesn't achieve what I need.
valueInputField.setInputType(0)
}
}
我试过上面的方式,它没有用。如何实现我的需求?
答案 0 :(得分:3)
也许你应该尝试低于逻辑
maxLength=inputChars.length
if (!inputChars.matches(MY_REGEXP)) {
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});
}
以上程序将设置EditText的最大长度,当它与regexp不匹配时。
答案 1 :(得分:2)
您必须在textView中添加一个InputFilter:
这是一个例子:
editText.filters = arrayOf(object: InputFilter {
override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence {
if (Regex("[0-9]*").matches(source!!)) {
return source
} else {
return source.subSequence(start, end-1)
}
}
})
每次调用editText中的输入时都会调用此过滤器方法。您可以在匹配正则表达式时返回源,否则,您可以返回源的subSequence,而不插入最后一个char。
代码示例在Kotlin中,翻译不应该给你任何问题:)
答案 2 :(得分:2)
您已经在做setInputType(InputType.TYPE_NULL)
。但它应该与setEnabled(false)
一起使用才能使其有效。
这也会改变背景颜色。强烈推荐它,因为它为用户提供了一条不接受输入的线索。但是,如果您愿意,可以将其更改为setBackgroundColor(Color.TRANSPARENT)
。
如果要隐藏光标,请添加setCursorVisible(false)
。
或者,您可以使用afterTextChanged
代替onTextChanged
,以便您可以操作文本。
答案 3 :(得分:1)
禁用编辑文本的输入类型在焦点或正在编辑时无法正常工作。将inout类型设置为null后,视图将开始接收keypress回调方法。因此,有类变量来验证字段并取消按下的键。 这里有示例代码。
public class SplashActivity extends AppCompatActivity{
EditText valueInputField;
private boolean allowValueField2Edit = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
....
valueInputField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2{
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String inputChars = charSequence.toString().trim();
// if doesn't match regular expression, stop showing more inputs
if (!inputChars.matches(MY_REGEXP)) {
// this doesn't achieve what I need.
valueInputField.setInputType(InputType.null);
allowValueField2Edit = false;
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
//Once you set the input type to none fore edit control, on Key lister will receive callbacks
valueInputField.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
//Here, you can add your custom logic to have key actions.
//retrun false will have key effect, return true
return !allowValueField2Edit;
}
});
希望这会有所帮助......
答案 4 :(得分:1)
如果要停止编辑文本中的建议,则应尝试以下操作:
editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
要在任何情况下再次启用,请使用以下命令:
editText.setInputType(InputType. TYPE_CLASS_TEXT);
以下是输入阈值大小的示例,这里也应使用正则表达式:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.length()< threshold){
editText.setInputType(InputType. TYPE_CLASS_TEXT);
}
if(s.length()>= threshold){
editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
答案 5 :(得分:0)
伪代码:
源代码:
editText.addTextChangedListener(new TextWatcher() {
...
@Override
public void afterTextChanged(Editable editable) {
String text = editable.toString();
// STEP 1
if(text.matches(myRegex) && !flag) {
// make sure that this code block is executed only once
flag = true;
// STEP 2
// when match is found, always return the same string
// therefore disabling further editing of the editText field
editText.setFilters(new InputFilter[]{
new InputFilter() {
@Override
public CharSequence filter(CharSequence charSequence, int i, int i1,
Spanned spanned, int i2, int i3) {
// STEP 3
return spanned.subSequence(i2, i3);
}
}
});
}
}
});
设置输入过滤器时,请注意正确的方法。 Please check this SO answer by Steven Byle。