Formatar automaticamente um número de telefone em um campo de texto
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Você pode formatar automaticamente um número de telefone em um campo de texto no app, economizando o tempo dos usuários
ao formatar o número de telefone conforme eles digitam os dígitos. Siga estas orientações
para formatar automaticamente um número de telefone:
Crie o campo de texto.
Formatar automaticamente um número no campo de texto.
Compatibilidade de versões
Essa implementação exige que o minSDK do projeto seja definido como nível 21 da API ou
mais recente.
Dependências
Criar o campo de texto
Primeiro, configure o TextField. Este exemplo mostra um número de telefone
formatado de acordo com o plano de numeração da América do Norte
(NANP).NanpVisualTransformation formata uma string bruta de números para NANP, por exemplo.
1234567890 para (123) 456-7890.
Um elemento combinável TextField em que o onValueChange usa uma expressão regular
para remover todos os caracteres não numéricos e limita o comprimento a um máximo de
10 caracteres antes de atualizar o estado phoneNumber.
O TextField tem uma instância VisualTransformation personalizada definida no
atributo visualTransformation. NanpVisualTransformation, a classe
personalizada instanciada aqui, é definida na próxima seção.
Formatar automaticamente um número no campo de texto
Para formatar uma string bruta de números, use a implementação da classe
NanpVisualTransformation personalizada:
classNanpVisualTransformation:VisualTransformation{overridefunfilter(text:AnnotatedString):TransformedText{valtrimmed=if(text.text.length>=10)text.text.substring(0..9)elsetext.textvarout=if(trimmed.isNotEmpty())"("else""for(iintrimmed.indices){if(i==3)out+=") "if(i==6)out+="-"out+=trimmed[i]}returnTransformedText(AnnotatedString(out),phoneNumberOffsetTranslator)}privatevalphoneNumberOffsetTranslator=object:OffsetMapping{overridefunoriginalToTransformed(offset:Int):Int=when(offset){0->offset// Add 1 for opening parenthesis.in1..3->offset+1// Add 3 for both parentheses and a space.in4..6->offset+3// Add 4 for both parentheses, space, and hyphen.else->offset+4}overridefuntransformedToOriginal(offset:Int):Int=when(offset){0->offset// Subtract 1 for opening parenthesis.in1..5->offset-1// Subtract 3 for both parentheses and a space.in6..10->offset-3// Subtract 4 for both parentheses, space, and hyphen.else->offset-4}}}
A função filter() insere os caracteres de formatação não numéricos nos
lugares apropriados.
O objeto phoneNumberOffsetTranslator contém dois métodos. Um mapeia os
deslocamentos entre a string original e a formatada, e o outro
faz o mapeamento reverso. Esses mapeamentos permitem pular os
caracteres de formatação quando o usuário muda a posição do cursor no campo
de texto.
A string formatada e o phoneNumberOffsetTranslator são usados como argumentos
para uma instância TransformedText que é retornada e usada pelo
TextField para realizar a formatação.
Resultados
Figura 1. Um número de telefone formatado automaticamente no campo de texto.
Coleções que contêm este guia
Este guia faz parte destas coleções selecionadas de guias rápidos que abrangem
metas mais amplas de desenvolvimento para Android:
Texto de exibição
O texto é uma peça central de qualquer interface. Descubra maneiras diferentes
de apresentar texto no app para oferecer uma experiência agradável ao usuário.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-02-06 UTC.
[null,null,["Última atualização 2025-02-06 UTC."],[],[],null,["# Auto-format a phone number in a text field\n\n\u003cbr /\u003e\n\nYou can auto format a phone number in a text field in your app, saving users\ntime by formatting the phone number as they input digits. Follow this guidance\nto auto format a phone number:\n\n- Create the text field.\n- Auto-format a number in the text field.\n\nVersion compatibility\n---------------------\n\nThis implementation requires that your project minSDK be set to API level 21 or\nhigher.\n\n### Dependencies\n\n### Kotlin\n\n\u003cbr /\u003e\n\n```kotlin\n implementation(platform(\"androidx.compose:compose-bom:2025.08.00\"))\n implementation(\"androidx.compose.material3:material3\")\n \n```\n\n\u003cbr /\u003e\n\n### Groovy\n\n\u003cbr /\u003e\n\n```groovy\n implementation platform('androidx.compose:compose-bom:2025.08.00')\n implementation 'androidx.compose.material3:material3'\n \n```\n\n\u003cbr /\u003e\n\nCreate the text field\n---------------------\n\nFirst, configure the [`TextField`](/reference/kotlin/androidx/compose/material/package-summary#TextField(androidx.compose.ui.text.input.TextFieldValue,kotlin.Function1,androidx.compose.ui.Modifier,kotlin.Boolean,kotlin.Boolean,androidx.compose.ui.text.TextStyle,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Boolean,androidx.compose.ui.text.input.VisualTransformation,androidx.compose.foundation.text.KeyboardOptions,androidx.compose.foundation.text.KeyboardActions,kotlin.Boolean,kotlin.Int,kotlin.Int,androidx.compose.foundation.interaction.MutableInteractionSource,androidx.compose.ui.graphics.Shape,androidx.compose.material.TextFieldColors)). This example shows a phone number\nformatted per the North American Numbering Plan\n(NANP).`NanpVisualTransformation` formats a raw string of numbers to NANP, eg.\n1234567890 to (123) 456-7890.\n\n\n```kotlin\n@Composable\nfun PhoneNumber() {\n var phoneNumber by rememberSaveable { mutableStateOf(\"\") }\n val numericRegex = Regex(\"[^0-9]\")\n TextField(\n value = phoneNumber,\n onValueChange = {\n // Remove non-numeric characters.\n val stripped = numericRegex.replace(it, \"\")\n phoneNumber = if (stripped.length \u003e= 10) {\n stripped.substring(0..9)\n } else {\n stripped\n }\n },\n label = { Text(\"Enter Phone Number\") },\n visualTransformation = NanpVisualTransformation(),\n keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)\n )\n}https://github.com/android/snippets/blob/dd30aee903e8c247786c064faab1a9ca8d10b46e/compose/snippets/src/main/java/com/example/compose/snippets/text/TextSnippets.kt#L797-L816\n```\n\n\u003cbr /\u003e\n\n### Key points about the code\n\n- A `TextField` composable where the `onValueChange` uses a regular expression to remove all non-numeric characters and limits the length to a maximum of 10 characters before updating the `phoneNumber` state.\n- The `TextField` has a custom [`VisualTransformation`](/reference/kotlin/androidx/compose/ui/text/input/VisualTransformation) instance set on the `visualTransformation` attribute. `NanpVisualTransformation`, the custom class instantiated here, is defined in the following section.\n\nAuto-format a number in the text field\n--------------------------------------\n\nTo format a raw string of numbers, use the implementation of the custom\n`NanpVisualTransformation` class:\n\n\n```kotlin\nclass NanpVisualTransformation : VisualTransformation {\n\n override fun filter(text: AnnotatedString): TransformedText {\n val trimmed = if (text.text.length \u003e= 10) text.text.substring(0..9) else text.text\n\n var out = if (trimmed.isNotEmpty()) \"(\" else \"\"\n\n for (i in trimmed.indices) {\n if (i == 3) out += \") \"\n if (i == 6) out += \"-\"\n out += trimmed[i]\n }\n return TransformedText(AnnotatedString(out), phoneNumberOffsetTranslator)\n }\n\n private val phoneNumberOffsetTranslator = object : OffsetMapping {\n\n override fun originalToTransformed(offset: Int): Int =\n when (offset) {\n 0 -\u003e offset\n // Add 1 for opening parenthesis.\n in 1..3 -\u003e offset + 1\n // Add 3 for both parentheses and a space.\n in 4..6 -\u003e offset + 3\n // Add 4 for both parentheses, space, and hyphen.\n else -\u003e offset + 4\n }\n\n override fun transformedToOriginal(offset: Int): Int =\n when (offset) {\n 0 -\u003e offset\n // Subtract 1 for opening parenthesis.\n in 1..5 -\u003e offset - 1\n // Subtract 3 for both parentheses and a space.\n in 6..10 -\u003e offset - 3\n // Subtract 4 for both parentheses, space, and hyphen.\n else -\u003e offset - 4\n }\n }\n}https://github.com/android/snippets/blob/dd30aee903e8c247786c064faab1a9ca8d10b46e/compose/snippets/src/main/java/com/example/compose/snippets/text/TextSnippets.kt#L820-L859\n```\n\n\u003cbr /\u003e\n\n### Key points about the code\n\n- The `filter()` function inserts the non-numeric formatting characters at the appropriate places.\n- The `phoneNumberOffsetTranslator` object contains two methods. One maps the offsets between the original string and the formatted one, and the other does the reverse mapping. These mappings enable the skipping of the formatting characters when the user changes the cursor location in the text field.\n- The formatted string and `phoneNumberOffsetTranslator` are used as arguments for a `TransformedText` instance that is returned and used by the `TextField` to perform the formatting.\n\nResults\n-------\n\n**Figure 1.** An auto-formatted phone number in the text field.\n\nCollections that contain this guide\n-----------------------------------\n\nThis guide is part of these curated Quick Guide collections that cover\nbroader Android development goals: \n\n### Display text\n\nText is a central piece of any UI. Find out different ways you can present text in your app to provide a delightful user experience. \n[Quick guide collection](/develop/ui/compose/quick-guides/collections/display-text) \n\n### Request user input\n\nLearn how to implement ways for users to interact with your app by entering text and using other means of input. \n[Quick guide collection](/develop/ui/compose/quick-guides/collections/request-user-input) \n\nHave questions or feedback\n--------------------------\n\nGo to our frequently asked questions page and learn about quick guides or reach out and let us know your thoughts. \n[Go to FAQ](/quick-guides/faq) [Leave feedback](https://issuetracker.google.com/issues/new?component=1573691&template=1993320)"]]