2016-03-03 53 views
2

我的代码:的setText()在afterTextChanged()显示相反的顺序文本

fractionNumEt.addTextChangedListener(new TextWatcher() { 

     boolean ignoreChange = false; 

     @Override 
     public void afterTextChanged(Editable s) { 
      if(!ignoreChange) { 
       String string = String.valueOf(s); 
       if (string.length() > 2) { 
        string = string.substring(0, string.length() - 1); 
        ignoreChange = true; 
        fractionNumEt.setText(string); 
        ignoreChange = false; 
       } 
      } 

     } 

....

我试图限制字符长度2,但要保留听力。当我输入'1','2'时,它显示“12”,这很好。现在当我输入'3'时,它会写入“31”而不是“23”。 这到底是怎么回事! 我也试过:

string = string.substring(1, string.length()); 

在这种情况下,它的工作原理是第一次n只有再没有什么改变。

+0

为什么你使用 String string = String.valueOf(s); –

+0

忽略这一点,我只是与每一种可能性 – usman

+0

战斗,你可以使用String string = s.toString(); –

回答

2

这是发生setText(),EditText上的光标返回到第一位置,因为之后。然后,任何新的号码将被添加在字符串的乞讨。

尝试如下更新代码:

@Override 
public void afterTextChanged(Editable s) { 
    if(!ignoreChange) { 
     String string = String.valueOf(s); 
     if (string.length() > 2) { 
      string = string.substring(0, string.length() - 1); 
      ignoreChange = true; 
      fractionNumEt.setText(string); 
      fractionNumEt.setSelection(fractionNumEt.getText().length()); 
      ignoreChange = false; 
     } 
    } 
} 

只是一个建议

检查可编辑的文档HERE

我觉得你并不需要将其转换为字符串。 afterTextChanged(Editable s)接收编辑作为参数。您可以直接更改它。不需要将其转换为字符串。此外,您甚至不需要制作EditText.setText(),因为可编辑内容的任何更改都会自动传递给EditText(因为Android会调用afterTextChanged,并让您有机会更新文本片刻之前在EditText中有效显示该文本)。

也许,这样的事情:

@Override 
public void afterTextChanged(Editable s) { 
    if(!ignoreChange) { 
     if(s.length() > 2) { 
      s.delete(s.length() - 1,s.length()); 
     } 
    } 
} 

玩可编辑的一点点,你会看到,它更容易。

+0

谢谢你!工作 – usman

+1

@usman我用一个建议更新我的答案。我认为你不需要转换为字符串,你不需要使用EditText.setText()...只需修改您收到的Editable ... – W0rmH0le