edtTxt.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
if(s.length() != 0 && s.length() == 2){
String str = s.toString();
str.replaceAll("..(?!$)", "$0:");
edtTxt.setText(str);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
}
});
我需要显示":"在第二个数字之后,例如10:25,最大长度是5个数字,它是edittext。 如果我在此之后开始输入edittext 10":"应该插入10:25应该在edittext中显示。 我试着用上面的逻辑不起作用。谁能帮我。提前致谢
答案 0 :(得分:1)
在replaceAll之后,您应该将值赋给同一个变量。工作正常..
public void afterTextChanged(Editable s) {
if(s.length() != 0 && s.length() == 3){
String str = s.toString();
str = str.replaceAll("..(?!$)", "$0:");
edtTxt.setText(str);
edtTxt.setSelection(edtTxt.getText().length()); //cursor at last position
}
}
答案 1 :(得分:0)
首先,您忽略str.replaceAll()
的结果。该方法返回String
。
if
条件可以简化为s.length() == 2
。
你正在使用的正则表达式不起作用。
输入2个字符后,这将在EditText中添加冒号
if (s.length() == 2) {
edtTxt.setText(s.toString() + ":");
}
答案 2 :(得分:0)
Kotlin 和改进版的 @sasikumar's solution:
private fun formatInput(clock: Editable?) {
if (clock.toString().isNotEmpty()
&& clock.toString().contains(":").not()
&& clock.toString().length == 3
) {
var str: String = clock.toString()
str = str.replace("..(?!$)".toRegex(), "$0:")
etClock.setText(str)
etClock.setSelection(etClock.text.length)
}
}
etClock.addTextChangedListener(
afterTextChanged = {
formatInput(it)
}
)
etClock.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
etClock.setSelection(etClock.text.length)
}
}
etClock.setOnClickListener {
etClock.setSelection(etClock.text.length)
}
对使用的正则表达式的一个很好的解释:https://stackoverflow.com/a/23404646/421467
答案 3 :(得分:0)
就这样吧
editTextTime.addTextChangedListener {
if(it?.length == 3 && !it.contains(":")){
it.insert(2,":")
}
}
I think the code is clear
if you put 3 number it will add ":" before the 3rd number
and it will check if your 3rd Char it not already :
then it will insert ":" for you