Hariharasudhan D
02/10/2023, 3:17 PMval textState = mutableStateOf("")
OutlinedTextField(
value = textState.value,
onValueChange = {
textState.value = convertToTSP(it)
})
fun convertToTSP(val:String){
return (NumberFormat.getNumberInstance(Locale.getDefault()) as DecimalFormat).apply {
val tsp = "##,###.##"
applyPattern(tsp)
}.format(value.toDouble())
}
While doing like this my cursor is not placed at the end of the string every time. Instead it placed around somewhere middle in between the string.
I've also tried VisualTransformation for this but It cause one more issue where on tap on anywhere in the textfield my cursor is not moving anywhere other than the end of the text.
Is anyone faced these similar issue? Please let if there any ways to solve this issue. Thanks in Advance
#compose #androidAlexSeleznev
02/10/2023, 3:55 PMval fieldValueState = remember { mutableStateOf(TextFieldValue(text = data.initialString, selection = TextRange(data.initialString.length))) }
Hariharasudhan D
02/10/2023, 3:55 PMAlexSeleznev
02/10/2023, 4:07 PMAlexSeleznev
02/10/2023, 4:08 PMHariharasudhan D
02/10/2023, 4:09 PMHariharasudhan D
02/10/2023, 4:10 PMAlexSeleznev
02/10/2023, 4:10 PMHariharasudhan D
02/10/2023, 4:11 PMAlexSeleznev
02/10/2023, 4:13 PMAlexSeleznev
02/10/2023, 4:14 PMAlexSeleznev
02/10/2023, 4:15 PMHariharasudhan D
02/10/2023, 4:16 PMAlexSeleznev
02/10/2023, 4:16 PMAlexSeleznev
02/10/2023, 4:17 PMAlexSeleznev
02/10/2023, 4:18 PMHariharasudhan D
02/10/2023, 4:18 PMAlexSeleznev
02/10/2023, 4:19 PMAlexSeleznev
02/10/2023, 4:19 PMAlexSeleznev
02/10/2023, 4:19 PMHariharasudhan D
02/10/2023, 4:20 PMAlexSeleznev
02/10/2023, 4:21 PMHariharasudhan D
02/10/2023, 4:21 PMAlexSeleznev
02/10/2023, 4:22 PMclass PhoneNumberVisualTransformation(formatter: AsYouTypeFormatter) : VisualTransformation {
private val phoneNumberFormatter = formatter
override fun filter(text: AnnotatedString): TransformedText {
val transformation = reformat("+$text", Selection.getSelectionEnd("+$text"))
val span = buildAnnotatedString {
val str = transformation.formatted?.replace("+", "") ?: ""
val firstSpaceIndex = str.indexOfFirst { it == ' ' }
append(str)
if (firstSpaceIndex == -1 && str.isNotEmpty() && str.length < 4) {
addStyle(style = SpanStyle(color = Color(0xff999A9F)), start = 0, str.length)
} else if (firstSpaceIndex != -1) {
addStyle(style = SpanStyle(color = Color(0xff999A9F)), start = 0, firstSpaceIndex)
}
}
return TransformedText(span, object : OffsetMapping {
override fun originalToTransformed(offset: Int): Int {
return transformation.originalToTransformed.getOrNull(offset) ?: 0
}
override fun transformedToOriginal(offset: Int): Int {
return transformation.transformedToOriginal[offset]
}
})
}
private fun reformat(s: CharSequence, cursor: Int): Transformation {
phoneNumberFormatter.clear()
val curIndex = cursor - 1
var formatted: String? = null
var lastNonSeparator = 0.toChar()
var hasCursor = false
s.forEachIndexed { index, char ->
if (PhoneNumberUtils.isNonSeparator(char)) {
if (lastNonSeparator.code != 0) {
formatted = getFormattedNumber(lastNonSeparator, hasCursor)
hasCursor = false
}
lastNonSeparator = char
}
if (index == curIndex) {
hasCursor = true
}
}
if (lastNonSeparator.code != 0) {
formatted = getFormattedNumber(lastNonSeparator, hasCursor)
}
val originalToTransformed = mutableListOf<Int>()
val transformedToOriginal = mutableListOf<Int>()
var specialCharsCount = 0
formatted?.forEachIndexed { index, char ->
if (!PhoneNumberUtils.isNonSeparator(char)) {
specialCharsCount++
} else {
originalToTransformed.add(index)
}
transformedToOriginal.add(index - specialCharsCount)
}
originalToTransformed.add(originalToTransformed.maxOrNull()?.plus(1) ?: 0)
transformedToOriginal.add(transformedToOriginal.maxOrNull()?.plus(1) ?: 0)
return Transformation(formatted?.replace("+", ""), originalToTransformed, transformedToOriginal)
}
private fun getFormattedNumber(lastNonSeparator: Char, hasCursor: Boolean): String? {
return if (hasCursor) {
phoneNumberFormatter.inputDigitAndRememberPosition(lastNonSeparator)
} else {
phoneNumberFormatter.inputDigit(lastNonSeparator)
}
}
private data class Transformation(
val formatted: String?,
val originalToTransformed: List<Int>,
val transformedToOriginal: List<Int>
)
}
Hariharasudhan D
02/10/2023, 4:27 PMHariharasudhan D
02/10/2023, 4:31 PMAlexSeleznev
02/10/2023, 4:33 PMHariharasudhan D
02/10/2023, 4:34 PM