XML (EditText) -> Compose (TextField, OutlinedTextField) 두개로 변경이 되었다.
두개로 나눈 이유는 디자인 스타일과 사용자 경험을 다르게 주기 위함이라고 한다.
두개의 차이가 무엇인지 확인 해 보자
설정 지정 없이 디버깅 했을 때 왼쪽이 TextField, 오른쪽이 OutlinedTextField이다.
왼쪽은 배경에 색상이 들어가있고 오른쪽엔 Outline이 그려져 있는것을 볼 수 있다. 해당 Field중 선호하는것을 사용하면 될 듯하지만
강조하고 싶은 느낌을 줄 때는 TextField, 깔끔하고 가독성이 필요한 경우엔 오른쪽이 적합해 보인다.
하지만 우린 과거에도 그랬고 미래에도 그럴 것이다.
우리는 디자인을 입혀야 하기때문에 개인 앱이 아닌 이상 저대로 사용할리가 만무하다.
그럼 우리가 할일은 무엇일까?
커스텀하기 좋게 평범한 입력창을 만들어야 한다.
자 그럼 어느것을 사용해야 할지 감이 잘 안올것이다.
우린 커스텀을 하기 위해선 백지로 돌아가야한다. 그럼 백지에 가장 가까운 것은 무엇인가?
바로 OutlinedTextField이다.
OutlinedTextField는 다음과 같은 이유로 커스텀을 하기가 쉽다.
1. 구조가 단순함 - 배경이 없고 테두리만 있어서, 커스텀 스타일 넣기가 쉽다
2. 테두리 조정 쉬움 - 속성 수정이 명확하기 때문에 원하는 값을 넣어 조정할 수 있다.
3. 배경 간섭이 없다 - TextField는 배경색이 들어가있지만 이 친구는 흰색이다.
4. 구글 샘플 디자인 예시에서도 OutlinedTextField가 더 많이 사용된다.
그럼 OutlinedTextField에 속성에 대해 학습해 보자
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
var text by remember { mutableStateOf(name) }
Box(modifier = Modifier.fillMaxWidth().fillMaxHeight(),
contentAlignment = Alignment.Center
) {
OutlinedTextField(
//현재 입력된 텍스트 값
value = text,
//텍스트가 바뀔 때 마다 실행되는 람다
onValueChange = { text = it },
//입력창 위에 표시되는 라벨 텍스트
label = { Text("이름") },
//입력 전 회색 안내 텍스트 (EditText: hint)
placeholder = { Text("이름을 입력 해 주세요.") },
//왼쪽에 아이콘 추가
leadingIcon = { Icon(Icons.Default.Person, contentDescription = null)},
//오른쪽에 아이콘 추가
trailingIcon = {
if (text.isNotEmpty()) {
IconButton(onClick = { text = ""}) {
Icon(Icons.Default.Close, contentDescription = "Clear")
}
}
},
//에러 상태 여부
isError = text.isEmpty(),
//한 줄 입력만 가능
singleLine = true,
//테두리 모양 (라운드 설정)
shape = RoundedCornerShape(4.dp),
//텍스트 스타일 지정
textStyle = TextStyle(fontSize = 16.sp, color = Color.Black),
// 색상 커스터마이징
colors = OutlinedTextFieldDefaults.colors(
// 포커스 있을 때 테두리 색
focusedBorderColor = Color.Blue,
// 포커스 없을 때 테두리 색
unfocusedBorderColor = Color.Gray,
// 에러 상태일 때 테두리 색
errorBorderColor = Color.Red,
// 커서 색상
cursorColor = Color.Blue
),
modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
)
}
}
텍스트가 비어있으면 에러상태로 설정이 가능하고 XML에 있던 EditText보다 더 유연해진 느낌이다.
그럼 속성값을 분석 해 보자
속성 | 설명 |
value | 초기에 자동으로 입력될 텍스트 값 (이전에 입력된 값을 다시 입력해 줄 때 사용) |
onValueChange | 텍스트가 바뀔 때 마다 실행되는 람다 (입력되는 값을 변수에 저장할 때 사용) |
label | 입력 창 위에 표시되는 라벨 텍스트 (설정할 일이 별로 없을 것 같음) |
placeholder | 입력 전 회색 안내 텍스트(EditText에서 hint역할) hint color, fontSize등 커스텀 가능 placeholder = { Text( text="이름을 입력 해 주세요.", fontSize = 11.sp, color = Color.Blue ) } |
leadingIcon | 입력 창 왼쪽에 아이콘 추가 |
trailingIcon | 입력 창 오른쪽에 아이콘 추가 |
isError | 에러 상태 여부 (입력 되면 안되는 값을 넣거나 텍스트가 비었을 때 에러 상태라는 것을 표시해주는 용도로 추정) |
singleLine | 한 줄 입력만 가능 |
shape | 테두리 모양 설정 (라운드 설정) |
textStyle | 입력되는 텍스트 스타일 지정 (폰트 크기 및 색상 등) |
colors | 색상 커스텀 (포커스 여부에 따른 테두리 색상 변경 및 커서 색상 등) |
위의 상태에서 테두리도 없고 입력창과 힌트만 있는 TextField를 구현하던가 테두리만 있고 입력창과 힌트만 있는 TextField를 구현해 보자
'Android개발 > Compose' 카테고리의 다른 글
[Android][Compose]Compose기초 (2) - Compose Text(TextView) (0) | 2025.05.27 |
---|---|
[Android][Compose]Compose기초 (1) - Compose 개념 (0) | 2025.05.26 |