Как сделать автоматическое добавление символа в EditText?
Нужны советы, примеры конечно приветствуются, но главная задача понять возможно ли это сделать и как это сделать (возможно некоректное объяснение - неопытность): Имеется
holder.planValue.setText(String.format(Locale.getDefault(), "%4f", dataList[position].planHa))
dataList[position].haTextWatcher?.let { holder.planValue.removeTextChangedListener(it) }
holder.planValue.filters = arrayOf(DecimalDigitsInputFilter( 4, 4 ))
dataList[position].haTextWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {...}
}
holder.planValue.addTextChangedListener(dataList[position].haTextWatcher)
Собственно есть некоторое количество EditText-ов (holder.planValue), у каждого своё полученное значение из бд, например: 38.6900, либо 123.0700. Если же отсутствует, то по дефолту записывается 0.0000. При фокусе на EditText, если значение "0.0000", то выполняется holder.planValue.SelectAll(), после ввода "1234" получаем:
0.0000 => 1234 // ввод блокируется из-за DecimalDigitsInputFilter(4, 4) и ожидает символ '.'
Ввели ".5678" получаем: 1234 => 1234.5678
Вопрос: как сделать автоматическое добавление '.' после введение первых 4-ых символов. Ввели "1471":
0.0000 => 1471.
Ввели "14719063":
0.0000 => 1471.9063
Но при этом, должна быть возможность самому поставить '.', если ввели "13.4600":
0.0000 => 13.4600
И бонусный вопрос: как запретить ввод '0', если это первый символ, то есть нельзя ввести "01.0200"
Ответы (1 шт):
Собственно добился чего хотел:
- Если значение равно "0.0000", то при фокусе выделяет весь текст
- При вводе '.' в пустую строку, или если весь текст выделен : _ || aaaa.bbbb => 0.
- При вводе '0' ~-~ : _ || aaaa.bbbb => 0.
- При вводе 4-ых символов 'aaaa' ~-~ : aaaa.bbbb || _ => aaaa.
Надеюсь, начинающим вроде меня будет полезным. Вроде при стирании символов работает адекватно. Критика приветсвуется.
class ThirdActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_third)
val editText: EditText = findViewById(R.id.edit_text)
editText.setText(String.format("%.4f", 0.0))
editText.filters = arrayOf(DecimalDigitsInputFilter(4,4))
editText.setOnFocusChangeListener{ _, hasFocus ->
if(hasFocus && (editText.text.toString() == "0.0000")) editText.setSelectAllOnFocus(true)
editText.selectAll()
}
}
class DecimalDigitsInputFilter(private val digitsBeforeDot: Int, private val digitsAfterDot: Int): InputFilter{
override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence? {
val builder = StringBuilder(dest)
builder.insert(dstart, source)
val temp = builder.toString()
val index = temp.indexOf('.')
return if ( ((temp == "." || temp == "0") && dest.isEmpty()) || ((source == "0" || source == ".") && dest.toString() == "0.0000")){
"0."
} else if (temp.length == 4 && !dest.contains('.') && dstart == 3 && dend == 3){
"$source."
} else if (index == -1){
if (temp.length > digitsBeforeDot){
""
} else{ null }
} else{
if(temp.substring(0, index).length > digitsBeforeDot || temp.substring(index + 1, temp.length).length > digitsAfterDot){
""
}else{
null
}
}
}
}
}