티스토리 뷰

공부/ComposeCamp 2022

Unit 2 : 맞춤 팁 계산기

데자와 맛있다 2022. 11. 29. 15:51
  • strings.xml 의 string 이름 바꾸기

-> 이렇게 하면 수동으로 코드에 있는 cost_of_service라는 이름을 변경해주지 않아도 자동 적용됨

 

  • Modifier와 재사용성
    • 컴포저블 함수에 기본적으로 Modifier매개변수를 제공해서 재사용성을 높이는것이 좋다
    • 이유는 아마 재사용하려는 컴포저블이 크기가 다르지만 하는일이 같은경우에 modifier매개변수로 각각 크기를 다르게 하려는거인듯
  • @StringRes
    • 매개변수가 문자열 리소스를 참조해야 함을 나타내는데 사용함
    • 유형 안전성을 갖추기 위함이다
    • 이런 어노테이션은 개발자, 린트와 같은 코드 검사 도구에 유용하다
    • 린트: 코드에 구조적 문제가 있는지 확인하는것, 린트도구를 사용해 구조적 문제로 인한 효율성, 코드관리에 지장을 줄 가능성이 있는 코드를 찾는것이 가능
    • 린트에 관한 자세한 설명: https://developer.android.com/studio/write/lint?hl=ko 
fun EditNumberField(
    @StringRes label: Int,//@StringRes 어노테이션으로 label이 항상 스트링 리소스 참조함을 알린다
    value: String, 
    onValueChange: (String)->Unit, 
    modifier: Modifier=Modifier 
){ }

 

  • 작업 버튼
    • 키보드 작업 버튼은 키보드 끝에 있는 버튼 하나를 의미한다
    • 작업버튼은 우리가 어떻게 설정하느냐에 따라 전송 버튼이 되기도 하고 검색버튼이 되기도 한다
    • 아래 예시를 보자

출처 android developer

  • 작업 버튼 설정하기
    • TextField의 keyboardOptions 속성을 추가하면됨
    • KeyboardOptions.Default.copy는 대문자 사용 및 자동 수정과 같은 다른 기본옵션을 사용하도록함
    • 설정만 하면 안되고 이 버튼을 눌렀을때 어떤 작업을 할지 추가 설정을 해줘야할때도 있다 그것은 아래에 기술함
TextField(
        value = value,//입력창에 표시될 값
        onValueChange =onValueChange,
        label={ Text(stringResource(id = label))},//라벨에 표시될것
        modifier = Modifier.fillMaxWidth(),
        singleLine = true,
        keyboardOptions = KeyboardOptions.Default.copy(
            keyboardType = KeyboardType.Number,//숫자만 있는 키보드
            imeAction = ImeAction.Next//작업버튼 설정, 누르면 다음 입력창으로 이동시켜줌
        )
//기본옵션
//참고: https://developer.android.com/reference/kotlin/androidx/compose/foundation/text/KeyboardOptions?hl=ko#copy(androidx.compose.ui.text.input.KeyboardCapitalization,kotlin.Boolean,androidx.compose.ui.text.input.KeyboardType,androidx.compose.ui.text.input.ImeAction)
fun copy(
    capitalization: KeyboardCapitalization = this.capitalization,
    autoCorrect: Boolean = this.autoCorrect,
    keyboardType: KeyboardType = this.keyboardType,
    imeAction: ImeAction = this.imeAction
): KeyboardOptions

아무 설정도 하지 않은 상태임 옵션이 ImeAction.Done일때 저 모습임

 

ImeAction.Next 설정한 상태

 

  • 키보드 작업 추가 설정
    • 개발자가 소프트웨어 키보드에서 사용자 입력방식 편집기(IME) 작업에 응답하여 트리거되는 작업을 지정할 수 있음(내맘대로 작업버튼 눌렀을때 동작을 설정하는것이 가능하다는 의미임)
    • IME 작업의 예시는 사용자가 Next, Done작업 버튼을 클릭하는 경우 등
  • 키보드 작업 추가 설정 Next, Done
    • Next: 가격 입력창에서 다음 텍스트 필드인 팁 퍼센트 입력창으로 이동되게 만든다
    • Done: 가상 키보드를 닫는다
    • LocalFocusManager: 컴포즈에서 포커스를 제어하는데 사용함 이 제어 변수를 사용해 텍스트 상자로 포커스를 이동하고 이전 텍스트 상자에서 포커스를 지운다
      • .clearFocus() : 포커스 맞춰진 입력창에 포커스를 지워서 키보드를 내린다
      • .moveFocus(): 포커스를 옮긴다
        • .moveFocus(FocusDirection.Down) : 포커스를 아래 텍스트필드로 옮긴다
    • KeyboardActions( onNext={}) 는 onNext에 Next를 눌렀을때 어떤 동작을 할지 정하는것
    • KeyboardActions( onDone={}) 는 onDone에 Done을 눌렀을때 어떤 동작할지 정하는것
    •  
val focusManager = LocalFocusManager.current
 
 ...
 
 EditNumberField(
            label = R.string.how_was_the_service,
            keyboardOptions=KeyboardOptions(
                keyboardType=KeyboardType.Number,
                imeAction=ImeAction.Done
            ),
            keyboardActions=KeyboardActions(
                onDone = {focusManager.clearFocus()}//done버튼 눌렀을때 동작 전달
            ),
            value = tipInput,
            onValueChange ={ tipInput=it }
        )
        
...

@Composable
fun EditNumberField(//숫자를 입력하는 TextField를 만들때 재사용가능함
    @StringRes label: Int,//TextField별로 다른 라벨이 필요함 재사용을 하려면
    keyboardOptions: KeyboardOptions,//각 텍스트 필드별 키보드 옵션다르게 함
    keyboardActions: KeyboardActions,//버튼 눌렀을때 동작받음
    value: String, //호이스팅 된 값을 받아옴, 텍스트필드에 표시될 값
    onValueChange: (String)->Unit, //호이스팅 된 값 업데이트하는 콜백함수
    modifier: Modifier=Modifier //컴포저블 함수에 Modifier를 주면 재사용성이 높아짐
){
    TextField(
        value = value,//입력창에 표시될 값
        onValueChange =onValueChange,
        label={ Text(stringResource(id = label))},//라벨에 표시될것
        modifier = Modifier.fillMaxWidth(),
        singleLine = true,
        keyboardOptions = keyboardOptions,
        keyboardActions = keyboardActions//버튼 눌렀을때 동작을 여기에 작성
    )
}

 

  • 스위치

스위치의 구성, 출처: android developer

@Composable
fun RoundTheTipRow(
    roundUp: Boolean,
    onRoundChanged: (Boolean)->Unit,
    modifier: Modifier=Modifier
){
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .size(48.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(text = stringResource(id = R.string.round_up_tip))
        Switch(
            checked = roundUp,//스위치가 선택되어 있는지 여부, 스위치 컴포저블 상태
            onCheckedChange =onRoundChanged, //스위치를 클릭할때 호출되는 콜백, it으로 변경된 스위치의 상태가 들어옴
            colors = SwitchDefaults.colors(
                uncheckedThumbColor = Color(190, 79, 79, 255)//스위치 false일때 thumb색
            )
        )
    }
}
  • 값 반올림
    • kotlin.math.ceil() 는 괄호 안의 정수값을 반올림함 10.73 -> 11.00 으로 반올림 
   tip = kotlin.math.ceil(tip)
  • val cannot be reassigned
    • val을 변경하려고 할때 생기는 에러, var로 고쳐라

결과화면

 

 

-참고사이트

https://developer.android.com/codelabs/basic-android-kotlin-compose-calculate-tip?hl=ko&continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-2-pathway-3%3Fhl%3Dko%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-calculate-tip#2 

 

맞춤 팁 계산하기  |  Android Developers

작업 버튼을 추가하고 키보드 작업을 설정하고 스위치 컴포저블을 사용하는 방법을 알아봅니다.

developer.android.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함