如何在EditText中自动添加空格

时间:2016-11-18 23:28:17

标签: android input android-edittext textwatcher

我正在构建一个简单的二进制十进制转换器,我希望在用户输入时将二进制字符串格式化为4位组。

观察其他类似的问题让我操纵了可编辑的方法“afterTextChanged”但是当我运行应用程序并输入4°数字时,应用程序冻结,RAM监视器开始变得疯狂。

另外,我的edittext“binary”设置为“numberDecimal”。我尝试使用我发现Here的东西暂时改变它,但我似乎无法让它发挥作用。

这是代码: (二进制是我的EditText)

binary.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) {

      }

       @Override
       public void afterTextChanged(Editable editable) {

            if(binary.isFocused()){

               temp = binary.getText().toString().replaceAll("\\s+","");

                  if(temp.length()%4==0){
                     InputFilter[] filters = editable.getFilters(); // save filters
                     editable.setFilters(new InputFilter[] {});     // clear filters
                     editable.insert(editable.length()-1," ");              // edit text
                     editable.setFilters(filters);
                  }

提前谢谢你:D

3 个答案:

答案 0 :(得分:1)

我想通了:添加空间以某种方式触发了无限循环。我设法解决了在添加空间之前移除焦点并在此之后重新添加焦点。我也对if条件进行了一些更改,所以现在我可以轻松地删除我的二进制数而不会使光标卡住。

 @Override
 public void afterTextChanged(Editable editable) {

        if(binary.isFocused()){

              if(((temp.length()%4 == 0 && temp.length()!=0) && tempSpace.length()<temp.length()) || (tempSpace.isEmpty() && temp.length()%4 == 0)){

                            InputFilter[] filters = editable.getFilters(); // save filters
                            editable.setFilters(new InputFilter[] {});

                           binary.clearFocus();                                // clear filters
                            editable.insert(editable.length()," ");
                            binary.requestFocus();
                                                           // edit text
                            editable.setFilters(filters);
              }

              tempSpace= temp;

其中tempSpace是一个临时变量,用于在用户按下按钮之前比较edittext的长度。

谢谢您的回答:D

答案 1 :(得分:0)

您应该实现TranformationMethod。使用TextWatcher时,您会遇到afterTextChanged()触发其他更改的任何更改的问题,因此如果您不小心如何检测到它何时适用,您可能会无限循环回应变化。

答案 2 :(得分:0)

此代码将字符串分开,并在自动添加空格之前将其分组为4个字符。

EditText ed;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ed = (EditText)findViewById(R.id.editText);
    ed.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 (count == 4)
            {
                ed.setText(ed.getText()+" ");
                ed.setSelection(ed.getText().length());
            }
        }
        @Override
        public void afterTextChanged(Editable s) {}
    });

我希望它有所帮助