自动将冒号添加到 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的主要内容,如果未能解决你的问题,请参考以下文章
在 Options Explicit 下的多列中自动插入冒号 (:)