自动将冒号添加到 Edittext

Posted

技术标签:

【中文标题】自动将冒号添加到 Edittext【英文标题】:Automatically add colon to Edittext 【发布时间】:2016-01-27 23:46:39 【问题描述】:

我想通过EditText 向我的数据库添加一个mac 地址

是否可以在第二个字符后添加一个冒号 (:)?

冒号应该直接显示在EditText中。

编辑:试过了。而且我认为我走在正确的道路上(您的回答证实了这一点:P)

        inputMac = (EditText) view.findViewById(R.id.editText_mac);
        inputMac.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() == 2 || s.length() == 5 || s.length() == 7 || s.length() == 9 || s.length() == 12 )
                    inputMac.setText(inputMac.getText() + ":");
               
            

            @Override
            public void afterTextChanged(Editable s) 

            
        );

但是现在在 12 个字符之后,我得到了例如123456789123:::::

【问题讨论】:

您到底想知道什么?把:放在edittext上? 我想要一个EditText。每隔一个字符就会出现一个:。我什么都没试过,因为我不知道如何在输入过程中向Edittext 添加一个字符。 是的,兄弟也有可能......首先你应该尝试一下......然后分享你的代码你卡在哪里了?? 如果你添加一个冒号,每第二个字符实际上就是你输入的每一个字符,因为冒号也是一个字符 Atm 我使用 6 EditTexts 除以 TextViews,其中包含 :。在我的 getData 方法中,我将它们合并在一起。但是我有 11 个字符串要合并... 【参考方案1】:

我已经回复了similar question,所以您可以通过以下方式实现它:

    String mTextValue;
    Character mLastChar = '\0'; // init with empty character
    int mKeyDel;


    myEditText.addTextChangedListener(new TextWatcher() 

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) 

           boolean flag = true;
           String eachBlock[] = myEditText.getText().toString().split(":");
           for (int i = 0; i < eachBlock.length; i++) 
                if (eachBlock[i].length() > 6) 
                    flag = false;
                
           
           if (flag) 

              myEditText.setOnKeyListener(new View.OnKeyListener() 

               @Override
               public boolean onKey(View v, int keyCode, KeyEvent event) 

                      if (keyCode == KeyEvent.KEYCODE_DEL)
                            mKeyDel = 1;
                            return false;
                      
                );

               if (mKeyDel == 0) 

                  if (((myEditText.getText().length() + 1) % 3) == 0) 
                      myEditText.setText(myEditText.getText() + ":");
                      myEditText.setSelection(myEditText.getText().length());
                  
                  mTextValue = myEditText.getText().toString();
                else 
                  mTextValue = myEditText.getText().toString();
                  if (mLastChar.equals(':')) 
                       mTextValue = mTextValue.substring(0, mTextValue.length() - 1);
                       myEditText.setText(mTextValue);
                       myEditText.setSelection(mTextValue.length());
                  
                  mKeyDel = 0;
               

           else 
              myEditText.setText(mTextValue);
          

       

       @Override
       public void beforeTextChanged(CharSequence s, int start, int count, int after) 
            if (s.length()>0) // save the last char value
                mLastChar = s.charAt(s.length() - 1);
             else 
                mLastChar = '\0';
            
       

       @Override
       public void afterTextChanged(Editable s) 

  );

PS:它也处理删除字符。

【讨论】:

你的 for 循环是错误的。它总是 【参考方案2】:

我试过了,我想我找到了一种不那么复杂的方法。 (它并不完美,但我想我会做到的)

       inputMac.addTextChangedListener(new TextWatcher() 
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) 
                macLengthBefore = inputMac.length();
                Log.d("Textlänge BEFORE", macLengthBefore.toString());
            

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) 

            

            @Override
            public void afterTextChanged(Editable s) 
                macLengthAfter = inputMac.length();
                Log.d("Textlänge AFTER", macLengthAfter.toString());

                if (macLengthAfter > macLengthBefore && ((inputMac.getText().length() + 1) % 3 == 0) && inputMac.length() <= 15) 
                    inputMac.setText(inputMac.getText() + ":");
                    inputMac.setSelection(inputMac.getText().length());
                

            
        );

感谢@Rami 进行模数查询

【讨论】:

【参考方案3】:

经过几次尝试和错误,我能够编写一个简单且有效的代码:

mEditText.addTextChangedListener(new TextWatcher() 

            public void afterTextChanged(Editable s) 
            

            public void beforeTextChanged(CharSequence s, int start,
                    int count, int after) 
            

            public void onTextChanged(CharSequence s, int start,
                    int before, int count) 
                if ((s.toString().length() < 17) && ((before == 1 && count == 2) || (before == 4
                        && count == 5))) 
                    String string = mEditText.getText().toString();
                    string = string.concat(":");
                    mEditText.setText(string);
                    mEditText.setSelection(string.length());
                
            
        );

以下代码进入您的 xml 文件:

<EditText
    android:id="@+id/edit_text"
    style="@style/textfield_wh"
    android:layout_
    android:layout_
    android:maxLength="17"
    android:digits="abcdefABCDEF0123456789:"
    android:inputType="text" />

【讨论】:

【参考方案4】:

试试这个,

editText1.addTextChangedListener(new TextWatcher() 

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) 
                // TODO Auto-generated method stub
                *****APPLY YOUR LOGIC HERE*****
                
            

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) 
                // TODO Auto-generated method stub

            

            @Override
            public void afterTextChanged(Editable s) 
                // TODO Auto-generated method stub

            
        );
    

【讨论】:

为什么我必须使用onTextChanged 方法? atm 我使用afterTextChanged 在每次更改后检查输入。 因为在onTextChanged中你会得到EditText的文本作为CharSequence。

以上是关于自动将冒号添加到 Edittext的主要内容,如果未能解决你的问题,请参考以下文章

idea中foreach为啥分两行

在 Options Explicit 下的多列中自动插入冒号 (:)

使用冒号、分号等符号将变量传递给 javascript 函数

使用SQLite保存数据并将其添加到ListView

关于伪类选择器中一个冒号和两个冒号的区别

Android:从运行时生成的文本字段中将数据保存到Firebase