android - EditText长度过滤器不能正常工作

时间:2018-02-19 15:21:59

标签: android android-edittext android-inputtype android-input-filter

首先我要说我在SO上已经阅读了类似的问题和答案,这个问题基本上是this question和其他许多问题的重复,但这些问题的答案并不像我想要的那样有效它

问题

以编程方式在我的EditText上设置长度过滤器,如下所示:

editText.setFilters(new InputFilter[]{new LengthFilter(10)} );

它唯一能做的就是隐藏EditText中超出限制的文本。它仍然显示建议框中的长(无限制)文本,我必须删除(退格)每个字母,然后才能删除EditText中显示的内容。

建议的解决方案:

  1. 将InputType设置为textFilter

    我以编程方式做到了这一点:

    editText.setInputType( InputType.TYPE_TEXT_VARIATION_FILTER );
    

    它隐藏了建议,但无限制文本仍然存在,我仍然需要使用退格键删除不应出现的字母。

  2. 将InputType设置为textNoSuggestions|textVisiblePassword

    我以编程方式执行此操作(必须添加TYPE_CLASS_TEXT,否则无效):

    editText.setInputType( InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
    

    这个确实有效,但问题是停止“手势输入”并将字体更改为等宽字体。

  3. 更好的解决方案?
    正如您所看到的,这两种方法实际上并没有其他问题。有没有其他方法可以做到这一点我错过了。如果我想保持手势输入和建议,我应该使用TextWatcher吗?

1 个答案:

答案 0 :(得分:1)

我最终使用的是TextWatcher。我不确定这是否是最好的方法,但它确实适用于建议,它不会关闭手势输入或更改字体样式。这就是我的做法(我对Android很新,所以如果需要改进,请随时告诉我)。

我在评论中添加了一个例子来澄清发生了什么。

制作这些全局变量:

   string     V1
 1:      A  1|1|1
 2:      B    1|1
 3:      C      1

然后创建TextWatcher并将其添加到EditText

private boolean mWatcherIsBlocked = false;
private String mBeforeChange;
private String mFilteredString; 
private int mCursorPosition = 0;