Skip to content

Instantly share code, notes, and snippets.

@LucasAlfare
Last active January 17, 2024 21:12
Show Gist options
  • Save LucasAlfare/5614d906d768b8b6fdec451c97681e5f to your computer and use it in GitHub Desktop.
Save LucasAlfare/5614d906d768b8b6fdec451c97681e5f to your computer and use it in GitHub Desktop.
Custom simple numeric text field for jetpack compose
// imports...
// just a wrapper to TextFiel composable, but validates the input to only numbers.
@Composable
fun NumericTextField(
value: Long = 0L,
minimumValue: Long = Long.MIN_VALUE,
maximumValue: Long = Long.MAX_VALUE,
modifier: Modifier = Modifier,
onLessMinimumValueEntered: (Long) -> Unit = {},
onHigherMaximumValueEntered: (Long) -> Unit = {},
onValueChange: (Long) -> Unit = {}
) {
// here we don't use "remember" because we don't want to store to make it update based on outside events
val numValue = mutableStateOf(value.toString())
TextField(
value = numValue.value,
modifier = modifier,
onValueChange = {
val filteredString = it.filter { c -> c.isDigit() }
if (filteredString.isNotEmpty()) {
val number = filteredString.toLong()
if (number < minimumValue) {
onLessMinimumValueEntered(number)
} else if (number > maximumValue) {
onHigherMaximumValueEntered(number)
} else {
numValue.value = number.toString()
onValueChange(number)
}
} else {
numValue.value = ""
onValueChange(0L)
}
}
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment