GDSC HUFS 4기/Kotlin Team #3

[3팀] Android-12-Kotlin : 코틀린 계산기 - XML사용법과 UI생성법 배우기 (Onclick-OnOperator)

비코(gyeom) 2022. 11. 3. 01:44

이 글은 Android12 및 코틀린 완전 정복를 참고하여 작성하였습니다.

작성자 : 김인겸

개발환경은 Windows, Android Studio입니다.

 

강의영상 : 95-97 까지의 내용입니다.

1. Onclick 으로 CLR기능 구현하기.

이번 강의에서는 전에 배운 것에서 추가로 CLR기능, 즉, 숫자들을 모두 지우는 기능을 추가하는 코드를 작성해 보겠습니다.

Ondigit 메소드를 이용하여 버튼 내의 Onclick과 연동하면, 내가 원하는 것들을 textview에 보여줄 수 있습니다.

● MainActivity.kt 내에
fun Ondigit(view : View){
                    tvInput?.append((view as Button).text)
}

위 식을 이용하면 우리가 원하는 숫자들을 표시할 수 있게 된다. 이와 반대로, 모든것을 지우는 것을 구현하기 위해서는,

fun onClear(view: View){
tvInput?.text = ""
//다음 기능에서 나옵니다
lastNumeric = false
lastDot = false }

의 식을 추가합니다. 이를 XML내의 버튼과 연동하면,


<Button
android:layout_marginEnd="5dp"
android:id="@+id/btnClear"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="onClear"
android:text="CLR" />

위의 식처럼 나타낼 수 있고, 실제로 구현하면 textview내의 숫자들을 지워줍니다.

 

2. OndemicalPoint 기능 구현하기.

위의 식에서 메소드를 버튼에 연동한 것 처럼, OndemicalPoint 를 연동하여 소숫점 계산을 구현할 수 있습니다.

● MainActivity.kt 내에
var lastNumeric: Boolean = false
var lastDot: Boolean = false
fun onDecimalPoint(view: View) {
if (lastNumeric && !lastDot) {
tvInput?.append(".")
lastNumeric = false 
lastDot = true }}

위의 식은 만약 마지막 입력값이 소숫점이 아니고, 숫자가 오면, 소숫점을 추가할 수 있다는 것을 나타내고, 이를 실행 시키기 위해서 lastNumeric = false 과 lastDot = true로 상태를 설정합니다.

이와 같이 상태에 따라서 인용문이 실행되거나 실행되지 않을 수 있는데, 이를 알려주는 함수를 플레그(Flag)라고도 합니다.

 

위 식을 XML내의 버튼과 연동하면,

<Button
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:id="@+id/btnDecimal"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="onDecimalPoint"
android:text="." />

위 식처럼 나타낼 수 있고, 소숫점을 계산할 수 있습니다.

 

3. StartWith로 OnOperator 기능 구현

숫자계산을 진행할 때, 연산자를 2개이상 사용하게 되거나, 연산자로 수식이 끝나서 계산이 안되는 경우를 판단하는 식을 추가해 줍니다.

또한, 음수의 계산을 가능하게 해야 하므로 이또한 추가해 줍니다.

● MainActivity.kt 내에
private fun isOperatorAdded(value: String): Boolean {
return if (value.startsWith("-")) {
false }
else {
(value.contains("/")
                            || value.contains("*")
                            || value.contains("-")
                            || value.contains("+")) } }}

위 식 내의 StartWith와 contains는 연산자를 추가할 것인지 아닌지를 판단합니다. 이 때 음수, 즉, -로 시작하는 숫자는 무시합니다.

이를 Onoperate함수에 대입합니다.

● MainActivity.kt 내에
fun onOperator(view: View) {
tvInput?.text?.let {
if (lastNumeric && !isOperatorAdded(it.toString())) {
tvInput?.append((view as Button).text)
lastNumeric = false
lastDot = false  }}}

이 때,tvInput?.text?.let함수는 textview 가 비어있는지 아닌지 판단하여 위 식을 진행합니다. (앱 안정성을 높이기 위해 이런 함수는 중요하게 작용합니다.)

이를 버튼과 연동하면,

→ 예시 : 더하기 연산버튼
<Button
android:layout_marginEnd="5dp"
android:id="@+id/btnAdd"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="onOperator"
android:text="+" />

이렇게 구현할 수 있습니다.

 

이상으로 블로그 포스팅을 마치겠습니다. 감사합니다.