앱의 텍스트 필드에서 전화번호 형식을 자동으로 지정하여 사용자가 숫자를 입력할 때 전화번호 형식을 지정하여 시간을 절약할 수 있습니다. 다음 안내에 따라 전화번호 형식을 자동으로 지정하세요.
- 텍스트 필드를 만듭니다.
- 텍스트 필드에서 숫자의 서식을 자동으로 지정합니다.
버전 호환성
이 구현을 사용하려면 프로젝트 minSDK를 API 수준 21 이상으로 설정해야 합니다.
종속 항목
텍스트 필드 만들기
먼저 TextField
를 구성합니다. 이 예에서는 북미 번호 지정 계획(NANP)에 따라 형식이 지정된 전화번호를 보여줍니다.NanpVisualTransformation
는 원시 숫자 문자열을 NANP로 형식 지정합니다(예:
1234567890에서 (123) 456-7890으로 변경됩니다.
@Composable fun PhoneNumber() { var phoneNumber by rememberSaveable { mutableStateOf("") } val numericRegex = Regex("[^0-9]") TextField( value = phoneNumber, onValueChange = { // Remove non-numeric characters. val stripped = numericRegex.replace(it, "") phoneNumber = if (stripped.length >= 10) { stripped.substring(0..9) } else { stripped } }, label = { Text("Enter Phone Number") }, visualTransformation = NanpVisualTransformation(), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number) ) }
코드 관련 핵심 사항
onValueChange
가 정규 표현식을 사용하여 숫자가 아닌 모든 문자를 삭제하고phoneNumber
상태를 업데이트하기 전에 길이를 최대 10자로 제한하는TextField
컴포저블입니다.TextField
에는visualTransformation
속성에 맞춤VisualTransformation
인스턴스가 설정되어 있습니다. 여기서 인스턴스화된 맞춤 클래스인NanpVisualTransformation
는 다음 섹션에 정의되어 있습니다.
텍스트 필드에서 숫자 자동 형식 지정
숫자의 원시 문자열 형식을 지정하려면 맞춤 NanpVisualTransformation
클래스의 구현을 사용하세요.
class NanpVisualTransformation : VisualTransformation { override fun filter(text: AnnotatedString): TransformedText { val trimmed = if (text.text.length >= 10) text.text.substring(0..9) else text.text var out = if (trimmed.isNotEmpty()) "(" else "" for (i in trimmed.indices) { if (i == 3) out += ") " if (i == 6) out += "-" out += trimmed[i] } return TransformedText(AnnotatedString(out), phoneNumberOffsetTranslator) } private val phoneNumberOffsetTranslator = object : OffsetMapping { override fun originalToTransformed(offset: Int): Int = when (offset) { 0 -> offset // Add 1 for opening parenthesis. in 1..3 -> offset + 1 // Add 3 for both parentheses and a space. in 4..6 -> offset + 3 // Add 4 for both parentheses, space, and hyphen. else -> offset + 4 } override fun transformedToOriginal(offset: Int): Int = when (offset) { 0 -> offset // Subtract 1 for opening parenthesis. in 1..5 -> offset - 1 // Subtract 3 for both parentheses and a space. in 6..10 -> offset - 3 // Subtract 4 for both parentheses, space, and hyphen. else -> offset - 4 } } }
코드 관련 핵심 사항
filter()
함수는 숫자가 아닌 형식 지정 문자를 적절한 위치에 삽입합니다.phoneNumberOffsetTranslator
객체에는 두 가지 메서드가 포함되어 있습니다. 하나는 원래 문자열과 형식이 지정된 문자열 간의 오프셋을 매핑하고 다른 하나는 역방향 매핑을 실행합니다. 이러한 매핑을 사용하면 사용자가 텍스트 필드에서 커서 위치를 변경할 때 서식 문자를 건너뛸 수 있습니다.- 형식이 지정된 문자열과
phoneNumberOffsetTranslator
는TextField
에서 반환되고 형식을 지정하는 데 사용되는TransformedText
인스턴스의 인수로 사용됩니다.
결과
![텍스트 필드에 자동 형식이 지정된 전화번호](https://developer.android.google.cn/static/quick-guides/content/nanp_formatter.gif?hl=ko)
이 가이드가 포함된 컬렉션
이 가이드는 더 광범위한 Android 개발 목표를 다루는 선별된 빠른 가이드 모음의 일부입니다.
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=ko)
표시 텍스트
텍스트는 모든 UI의 핵심 요소입니다. 만족도 높은 사용자 환경을 제공하기 위해 앱에서 텍스트를 표시하는 다양한 방법을 알아보세요.
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=ko)
사용자 입력 요청
사용자가 텍스트를 입력하고 다른 입력 수단을 사용하여 앱과 상호작용할 수 있는 방법을 구현하는 방법을 알아봅니다.
질문이나 의견이 있으신가요?
자주 묻는 질문(FAQ) 페이지로 이동하여 빠른 가이드를 알아보거나 문의하여 의견을 보내주세요.