본문 바로가기
개발

(17) 독학으로 앱 만들어보기 (개발 과정)

by 라이프_디자이너 2022. 12. 3.
반응형

독학으로 앱 만들어보기 본격 코딩 시작. 지난 포스팅에 남겨놓은 의문점을 해결하는 과정을 담아보겠다.

 

  1. 목표 달성한 횟수를 어떻게 표시하지?
  2. 여태까지 몇 번 목표 달성했는지 누가 기억해주지? 
  3. 목표 설정은 어디서 하지?

2022.12.02 - [개발] - (16) 독학으로 앱 만들어보기 (입력, 화면 구성)

 

(16) 독학으로 앱 만들어보기 (입력, 화면 구성)

화면 구성, 입력, 텍스트 보여주기, 버튼을 모두 사용하여 간단한 앱을 만들어 본다. 공부는 매일 하는데, 블로그에 내가 공부한 방대한 양을 정리한다는 게 쉽지가 않다. 그래도, 독학으로 앱 만

dev-nasus.tistory.com

 

목표 달성한 횟수를 어떻게 표시하지?

 

몇 번 목표 쓰기를 했는지 표시하는 TextView를 만들어 둔 곳이 있다. 저번 포스팅에서 EditText에 입력한 내용을 보여주기 위해 목표 달성 버튼을 클릭하면 아래에 작은 메시지가 보이도록 했었다. 이걸 응용하여 버튼을 눌렀을 때마다 TextView에 표시해보겠다.

 

package com.example.cometrue

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    private var goalCount: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.lock)
        val btnGoal : Button = findViewById(R.id.btn_goal)

//        btnGoal.setOnClickListener { showText() }
        btnGoal.setOnClickListener {increaseGoalCount()}
    }

    private fun increaseGoalCount() {
        val textGoalCount: TextView = findViewById(R.id.text_count)
        textGoalCount.setText(goalCount++)
    }

    private fun showText() {
        val editGoal: EditText = findViewById(R.id.edit_goal)
        Toast.makeText(this,editGoal.text, Toast.LENGTH_SHORT).show()
    }
}

goalCount 라는 변수를 만들어줬다. 그리고 버튼을 눌렀을 때 showText() 함수를 호출하던 부분은 주석 처리를 했다. 대신 그 자리에 새로 만든 increaseGoalCount()라는 함수를 추가하였다. 

반응형

increaseGoalCount() 함수에는 목표를 몇번 썼는지 표시해주는 TextView의 ID값을 불러와서 setText로 goalCount를 넣어줬다. 이렇게 하고 실행을 시켜봤다.... 예상대로 되지 않고 어플이 바로 종료됐다. 그래서 원인을 파악하고자 에러를 확인하였다. 

알 수 없는 말들이 많이 보인다. 여기서 집중해서 봐야 할 것은 내가 아는 내용이다. MainActivity.kt는 내가 아는 내용이다. 저기서 무슨 에러가 발생했다는 내용이다. MainActivity.kt 옆에 적혀있는 숫자는 코드를 입력한 라인 수를 의미한다. 저 파란 글씨를 클릭하면 해당 소스코드로 이동한다. 

setText 함수를 하는 곳이 이상하다는 이야기다. 정확한 원인을 파악하기 위해 에러 문구를 구글링 해본다.

android.content.res.Resources$NotFoundException: String resource ID #0x0

 

검색 결과 비슷한 에러를 경험한 사람들이 많았고 내용을 보니 String (문자열) 타입을 넣어야 하는데 Int(숫자) 타입을 넣어서 그렇다고 한다. 그러면 Int 타입을 어떻게 String 타입으로 바꿀 수 있을까? 2가지 방법이 있다.

 

  • 변수명에 toString() 함수 붙이기
  • Int 변수명에 + "" 공백 문자열 더하기
    private fun increaseGoalCount() {
        val textGoalCount: TextView = findViewById(R.id.text_count)
        goalCount++

//        textGoalCount.setText(""+goalCount)
        textGoalCount.setText(goalCount.toString())
    }

코드로 구현하면 위와 같다. 효과는 동일하다. toString()이라고 하는 것이 더 직관적인 거 같아서 toString()으로 적용해서 다시 실행해보니 원하는 대로 잘 표시가 되었다.


여태까지 몇 번 목표 달성했는지 누가 기억해주지? 

 

우리가 누구랑 얘기한 내용을 기억하기 위해 달력에 메모를 하거나 종이에 적어야 한다. 프로그램을 만들 때는 DB(Database)라는 것을 이용한다. 깊게 들어가면 여러 가지 많은 내용이 있는데, 안드로이드에서 제공하는 SQLite를 사용하면 우리가 종이에 적어두는 것처럼 우리가 기억하고 싶은 내용을 저장할 수 있다. SQLite 사용하는 방법을 구글링 해본다. 역시나 구선생님은 오늘도 다 알려주신다.

잘 설명해놓은 글들을 보니, 이 포스팅에 내용을 다 담기에는 양이 너무 많을 거 같다는 생각이 든다. 우선 내가 코딩으로 직접 경험한 후에 정리하는 형태로 남겨보겠다.


목표 설정은 어디서 하지?

 

목표 달성을 버튼을 눌렀을 때, EditText에 입력된 내용과 동일한지 확인하여 잠금해제가 되도록 해야 하는데 이루려고 하는 목표를 등록하고 볼 수 있는 화면이 필요하다. 이 화면은 예전에 그려둔 화면을 XML 코드로만 옮겨놓고 다음 포스팅에서 이어가 보도록 한다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/list_goal"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

    </androidx.recyclerview.widget.RecyclerView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_add_goal"
            android:layout_margin="10dp"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="목표 추가"/>

        <Button
            android:id="@+id/btn_del_goal"
            android:layout_margin="10dp"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="목표 삭제"/>
        
    </LinearLayout>
</LinearLayout>

 

마지막으로 새로운 의문점을 남겨둔다.

 

  • Recycle View는 어떻게 사용하는 거지?
  • SQLite를 어떻게 적용할 수 있을까?
반응형

댓글