์ค์ ํ๋ก์ ํธ
์ค์ต - ๋น๋ง๋ ๊ณ์ฐ๊ธฐ
์ฃผ์๊ตฌ์ฑ
- ๋ชธ๋ฌด๊ฒ๋ฅผ ์ ๋ ฅํ๋ ํ๋ฉด๊ณผ ๋น๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฉด์ผ๋ก ๊ตฌ์ฑ๋์ด ์กํฐ๋นํฐ๊ฐ ๋ ๊ฐ ํ์ํจ
- ์ธํ ํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ์ ๋ฌํจ
- ConstraintLayout ๊ธฐ๋ฐ
1. res > values > color.xml
- ์ก์ ๋ฐ ์์ ๋ฐ๊พธ๊ธฐ ์ํด ์ปฌ๋ฌ ์ฝ๋ ์ถ๊ฐ
- 16์ง์๋ก
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<!--์ปฌ๋ฌ ์ถ๊ฐ-->
<color name="teal_700">#FF018786</color>
<color name="green_700">#00584A</color>
</resources>
2. res > values > themes > themes.xml
- <style name="Base.Theme.BmiCalculator" parent="Theme.Material3.DayNight.noActionBar ">์์ .noActionBar ์ง์ฐ๊ธฐ (์ฑ ์คํ ์์ผฐ์ ๋ ์ก์ ๋ฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์)
- ์ก์ ๋ฐ ์์ ๋ฐ๊พธ๊ธฐ ์ฝ๋ ์ถ๊ฐ
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.BmiCalculator" parent="Theme.Material3.DayNight">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
<!--์ฝ๋ ์ถ๊ฐ-->
<item name="colorPrimary">@color/teal_700</item>
<item name="colorPrimaryVariant">@color/green_700</item>
</style>
<style name="Theme.BmiCalculator" parent="Base.Theme.BmiCalculator" />
</resources>
3. activity_main.xml design๋ชจ๋์์ ์์ ฏ ์ถ๊ฐ
- EditText 2๊ฐ, Button 1๊ฐ
4. activity_result.xml design๋ชจ๋์์ ์์ ฏ ์ถ๊ฐ
- File > New > Activity > Empty View Activity ๋ค์ด๊ฐ์ ์์ฑ (์ด๋ฆ: ResultActivity(xml ์๋ ์์ฑ๋จ))
- TextView 1๊ฐ
5. res ์ฐํด๋ฆญ New > Vector Asset
- Clip art์์ ์์ด์ฝ ์ ํ (๐๐๐ฆ 3๊ฐ์ง ์์ด์ฝ)
- ๊ฒฝ๋ก: res > drawble
6. activity_result.xml design๋ชจ๋์์ ์์ ฏ ์ถ๊ฐ
- Image 1๊ฐ
- ์ถ๊ฐํ ์ด๋ฏธ์ง ์ฐฝ ๋ธ
- ์ถ๊ฐํ ์ด๋ฏธ์ง ์ค ํ๋๋ฅผ ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ก ์ค์
- ์ด๋ฏธ์ง ์์ด์ฝ ์ ๋ฐ๊พธ๊ธฐ: ์ฐ์ธก Attributes ์ฐฝ > All Attributes > tint
7. ์ฝํ๋ฆฐ ์ฝ๋ ์์ฑ - ์ธํ ํธ๋ก ํ๋ฉด ์ ํ
1) MainActivity.kt ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฒฐ๊ณผ ํ๋ฉด์ผ๋ก ์ ํํ๋ ์ฝ๋ ์์ฑ
- ์ฒซ ๋ฒ์งธ ํ๋ฉด์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ ๋ฒ์งธ ํ๋ฉด์ด ์ถ๋ ฅ : ํ๋ฉด์ ์ ํํ๋ ค๋ฉด ์ธํ ํธIntent๋ฅผ ์ฌ์ฉ
- ์ธํ ํธ : ๋ค๋ฅธ ์กํฐ๋นํฐ๋ฅผ ์์ํ ์ ์๊ณ , ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ ๋ณด๋ผ ์๋ ์์
package com.example.bmicalculator
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
class MainActivity : AppCompatActivity() {
lateinit var resultButton: Button // ์ถํ์ ์ด๊ธฐํ ๋ณ์ํ์
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
resultButton = findViewById<Button>(R.id.resultButton)
resultButton.setOnClickListener {
var intent = Intent(this, ResultActivity::class.java)
startActivity(intent)
}
}
}
2) ์ด์ ํ๋ฉด์ผ๋ก ๋์๊ฐ๋ ์ ๋ค๋น๊ฒ์ด์
- app > manifests > AndroidManifest.xml
- 18๋ฒ์งธ ์ค android:parentActivityName=".MainActivity" ์ถ๊ฐ
โ ํ๋ก์ ํธ ์ฐฝ์์ AndroidManifest.xml ํ์ผ์ ๋๋ธํด๋ฆญํ์ฌ ์ด๊ธฐ
โก ์๋ํฐ ์ฐฝ์ xml ์ฝ๋๊ฐ ํ์๋๋๋ฐ ๋ ๋ฒ์งธ ์กํฐ๋นํฐ์parentActivityName ์์ฑ ์ถ๊ฐ
โข ๋ ๋ฒ์งธ ํ๋ฉด์ ํด๋ฐ์ ๋ค๋ก ๊ฐ๊ธฐ ์์ด์ฝ์ด ํ์
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BmiCalculator"
tools:targetApi="31">
<activity
android:name=".ResultActivity"
android:exported="false"
android:parentActivityName=".MainActivity" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3) ์ธํ ํธ์ ๋ฐ์ดํฐ ๋ด๊ธฐ
โ ์ ์ธํ ๋๊ฐ(ํค, ๋ชธ๋ฌด๊ฒ ์ ๋ ฅ ์นธ)์ EditText ์ ์ํ๊ณ
โก ๋ ์ด์์์ ์ ์๋ ์์ ฏ ์ฐ๊ฒฐ
โข ResultActivity๋ก ๋ณด๋ผ ๋ฐ์ดํฐ ์ถ์ถํ์ฌ intent ๊ฐ์ฒด์ ์ ์ฅ
- putExtra ( ) - key์ ๊ฐvalue์ ์์ผ๋ก ๋ฐ์ดํฐ ์ ์ฅ
package com.example.bmicalculator
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
lateinit var resultButton: Button // ์ถํ์ ์ด๊ธฐํ ๋ณ์ํ์
lateinit var heightEditText: EditText
lateinit var weightEditText: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
resultButton = findViewById<Button>(R.id.resultButton)
heightEditText = findViewById<EditText>(R.id.heightEditText)
weightEditText = findViewById<EditText>(R.id.weightEditText)
resultButton.setOnClickListener {
var intent = Intent(this, ResultActivity::class.java)
intent.putExtra("height", heightEditText.text.toString())
intent.putExtra("weight", weightEditText.text.toString())
startActivity(intent)
}
}
}
4) ๋น๋ง๋๋ฅผ ๊ณ์ฐํ์ฌ ๋ถ๊ธฐ ์ฒ๋ฆฌ (ResultActivity.kt)
โ Intent๋ก ๋ถํฐ height์ weight๋ฅผ ๋ฐ์
โก ํค๋ฅผ 100์ผ๋ก ๋๋ ์ ๊ณฑ์ ๋ชธ๋ฌด๊ฒ์์ ๋๋๋ฉด BMI๊ฐ ์ถ๋ ฅ
โข ์ถ๋ ฅ์ ์ํด textView ์ ์ธ ํ ์ฐ๊ฒฐ
โฃ when์ ์ฌ์ฉํ์ฌ BMI๊ฐ์ด ํน์ ๊ตฌ๊ฐ์ ์์ผ๋ฉด ํด๋นํ๋ ๋ฉ์์ง๋ฅผ ํ์
โค ์ด๋ฏธ์ง ๋ณ๊ฒฝ์ ์ํด imageView ์ ์ธ ํ ์ฐ๊ฒฐ
โฅBMI๊ฐ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์ด๋ฏธ์ง๊ฐ ๋์ค๋๋ก when์ ์ฌ์ฉํ์ฌ ๊ตฌ๊ฐ๋ง๋ค ์ด๋ฏธ์ง๋ฅผ ๊ต์ฒด
package com.example.bmicalculator
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageView
import android.widget.TextView
class ResultActivity : AppCompatActivity() {
lateinit var resultTextView: TextView
lateinit var imageView: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_result)
resultTextView = findViewById<TextView>(R.id.textView)
imageView = findViewById<ImageView>(R.id.imageView)
var height = intent.getStringExtra("height")!!.toInt()
var weight = intent.getStringExtra("weight")!!.toInt()
// BMI ๊ณ์ฐ
var bmi = weight / Math.pow(height/100.0, 2.0)
// ๊ธ์๋ก ์ถ๋ ฅ
when {
bmi >= 35 -> resultTextView.text = "๊ณ ๋ ๋น๋ง"
bmi >= 30 -> resultTextView.text = "2๋จ๊ณ ๋น๋ง"
bmi >= 25 -> resultTextView.text = "1๋จ๊ณ ๋น๋ง"
bmi >= 23 -> resultTextView.text = "๊ณผ์ฒด์ค"
bmi >= 18.5 -> resultTextView.text = "์ ์"
else -> resultTextView.text = "์ ์ฒด์ค"
}
// ์ด๋ฏธ์ง๋ก ์ถ๋ ฅ
when {
bmi >= 23 -> imageView.setImageResource(R.drawable.baseline_sentiment_very_dissatisfied_24)
bmi > 18.5 -> imageView.setImageResource(R.drawable.baseline_sentiment_satisfied_alt_24)
else -> imageView.setImageResource(R.drawable.baseline_mood_bad_24)
}
}
}
5) Toast ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ฉ์์ง ํ์
- ํ ์คํธ : ์๋๋ก์ด๋ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉ์ ํ๋จ์ ์ ๊น ๋ณด์๋ค ์ฌ๋ผ์ง๋ ๋ฉ์์ง
// ์ ์ฝ๋ ์๋ต
import android.widget.Toast
class ResultActivity : AppCompatActivity() {
// ResultActivity.kr ์ด๋ฏธ์ง ์ถ๋ ฅ ์ฝ๋ ์๋์ ์์ฑ (์ ์๋ต)
Toast.makeText(this, "$bmi", Toast.LENGTH_SHORT).show()
}
}
8. ์ฝํ๋ฆฐ ์ฝ๋ ์์ฑ - SharedPreference๋ก ๋ฐ์ดํฐ ์ ์ฅ
1) ๋ฐ์ดํฐ ์ ์ฅ
- MainActivity.kt์ ํค์ ๋ชธ๋ฌด๊ฒ๋ฅผ ์ ์ฅํ๋ ํจ์ ์์ฑ : onCreateํจ์ ์๋ ์ ์ธ
- https://developer.android.com/training/data-storage/shared-preferences?hl=ko
โ getPreferences() ๋ฉ์๋๋ ๊ณต์ ํ๊ฒฝ์ค์ (SharedPreferences) ํ์ผ ์ ๊ณต ๊ณต์ ํ๊ฒฝ์ค์ ํ์ผ์ ์ฐ๋ ค๋ฉด edit() ๋ฉ์๋ ํธ์ถํ์ฌ SharedPreferences.Editor ์์ฑ
โก editor์ ํค, ๋ชธ๋ฌด๊ฒ ์นธ์ ์ ๋ ฅ๋ ๊ฐ์ apply() ๋ฉ์๋๋ก ์ ์ฅ ํจ
โข [๊ฒฐ๊ณผ]๋ฒํผ์ ๋๋ฅด๋ ์์ ์ saveData()๋ฅผ ํธ์ถ(ํค, ๋ชธ๋ฌด๊ฒ๋ฅผ ํ๋ผ๋ฉํฐ๋ก ์ ์ก)
class MainActivity : AppCompatActivity() {
// ์ฝ๋ ์๋ต
resultButton.setOnClickListener {
saveData(heightEditText.text.toString().toInt(), weightEditText.text.toString().toInt())
var intent = Intent(this, ResultActivity::class.java)
intent.putExtra("height", heightEditText.text.toString())
intent.putExtra("weight", weightEditText.text.toString())
startActivity(intent)
}
}
private fun saveData(height:Int, weight:Int) {
var pref = this.getPreferences(0)
var editor = pref.edit()
editor.putInt("KEY_HEIGHT", heightEditText.text.toString().toInt()).apply()
editor.putInt("KEY_WEIGHT", weightEditText.text.toString().toInt()).apply()
}
}
2) ๋ฐ์ดํฐ ๋ถ๋ฌ ์ค๊ธฐ
- MainActivity.kt์ ํค์ ๋ชธ๋ฌด๊ฒ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์ ์์ฑ : onCreateํจ์ ์๋ ์ ์ธ
โ getPreferences() ๋ฉ์๋๋ ๊ณต์ ํ๊ฒฝ์ค์ (SharedPreferences) ํ์ผ ์ ๊ณต height, weight ๋๊ฐ์ ๋ณ์์ ๊ณต์ ํ๊ฒฝ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ getInt() ๋ฉ์๋๋ก ๊ฐ์ ธ์ด
โก ๊ณต์ ํ๊ฒฝ๋ณ์์ ํค์ ๋ชธ๋ฌด๊ฒ ๊ฐ์ด 0์ด ์๋ ๊ฐ์ผ๋ก ์ ์ฅ๋์ด ์์ผ๋ฉด ์ ๋ ฅ ์นธ์ ์ ์ฅ๋ ๊ฐ์ ํ์ํจ
โข ์ฑ ์คํํ์๋ง์ loadData() ํจ์๋ฅผ ํธ์ถํ์ฌ ์ด์ ๊ฐ์ ์ค์ ํจ
class MainActivity : AppCompatActivity() {
lateinit var resultButton: Button // ์ถํ์ ์ด๊ธฐํ ๋ณ์ํ์
lateinit var heightEditText: EditText
lateinit var weightEditText: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
resultButton = findViewById<Button>(R.id.resultButton)
heightEditText = findViewById<EditText>(R.id.heightEditText)
weightEditText = findViewById<EditText>(R.id.weightEditText)
loadData()
// resultButton.setOnClickListener ์๋ต
}
// saveData() ์๋ต
private fun loadData() {
var pref = this.getPreferences(0)
var height = pref.getInt("KEY_HEIGHT", 0)
var weight = pref.getInt("KEY_WEIGHT", 0)
if(height != 0 && weight != 0) {
heightEditText.setText(height.toString())
weightEditText.setText(weight.toString())
}
}
}
๊ฒฐ๊ณผ
์ ๋ฆฌ
- ์ด๋ฏธ์ง ๋ทฐ์ ํ์ํ ์์ด์ฝ์ ์์ ์คํ๋์ค์์ ์์ฑํ ์ ์์
- ์กํฐ๋นํฐ ๊ฐ ํ๋ฉด ์ ํ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ์ ํ๋ ๋ฐ ์ธํ ํธ๋ฅผ ์ฌ์ฉ
- ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ๋ฐ ๋ณต์ํ ๋๋ SharedPreference๋ฅผ ์ฌ์ฉ
์์ฉ - ์ด๋ฆ ์ถ๊ฐ
package com.example.bmicalculator
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
lateinit var resultButton: Button // ์ถํ์ ์ด๊ธฐํ ๋ณ์ํ์
lateinit var heightEditText: EditText
lateinit var weightEditText: EditText
lateinit var nameEditText: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
resultButton = findViewById<Button>(R.id.resultButton)
heightEditText = findViewById<EditText>(R.id.heightEditText)
weightEditText = findViewById<EditText>(R.id.weightEditText)
nameEditText = findViewById<EditText>(R.id.nameEditText)
loadData()
resultButton.setOnClickListener {
saveData(heightEditText.text.toString().toInt(), weightEditText.text.toString().toInt())
var intent = Intent(this, ResultActivity::class.java)
intent.putExtra("name", nameEditText.text.toString())
intent.putExtra("height", heightEditText.text.toString())
intent.putExtra("weight", weightEditText.text.toString())
startActivity(intent)
}
}
private fun saveData(height:Int, weight:Int) {
var pref = this.getPreferences(0)
var editor = pref.edit()
editor.putString("KEY_NAME", nameEditText.text.toString()).apply()
editor.putInt("KEY_HEIGHT", heightEditText.text.toString().toInt()).apply()
editor.putInt("KEY_WEIGHT", weightEditText.text.toString().toInt()).apply()
}
private fun loadData() {
var pref = this.getPreferences(0)
var name = pref.getString("KEY_NAME", "")
var height = pref.getInt("KEY_HEIGHT", 0)
var weight = pref.getInt("KEY_WEIGHT", 0)
if(name != "" && height != 0 && weight != 0) {
nameEditText.setText(name.toString())
heightEditText.setText(height.toString())
weightEditText.setText(weight.toString())
}
}
}
package com.example.bmicalculator
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
class ResultActivity : AppCompatActivity() {
lateinit var resultTextView: TextView
lateinit var imageView: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_result)
resultTextView = findViewById<TextView>(R.id.textView)
imageView = findViewById<ImageView>(R.id.imageView)
var name = intent.getStringExtra("name")
var height = intent.getStringExtra("height")!!.toInt()
var weight = intent.getStringExtra("weight")!!.toInt()
// BMI ๊ณ์ฐ
var bmi = weight / Math.pow(height/100.0, 2.0)
// ๊ธ์๋ก ์ถ๋ ฅ
when {
bmi >= 35 -> resultTextView.text = "๊ณ ๋ ๋น๋ง"
bmi >= 30 -> resultTextView.text = "2๋จ๊ณ ๋น๋ง"
bmi >= 25 -> resultTextView.text = "1๋จ๊ณ ๋น๋ง"
bmi >= 23 -> resultTextView.text = "๊ณผ์ฒด์ค"
bmi >= 18.5 -> resultTextView.text = "์ ์"
else -> resultTextView.text = "์ ์ฒด์ค"
}
// ์ด๋ฏธ์ง๋ก ์ถ๋ ฅ
when {
bmi >= 23 -> imageView.setImageResource(R.drawable.baseline_sentiment_very_dissatisfied_24)
bmi > 18.5 -> imageView.setImageResource(R.drawable.baseline_sentiment_satisfied_alt_24)
else -> imageView.setImageResource(R.drawable.baseline_mood_bad_24)
}
Toast.makeText(this, "$name" + " : " + "$bmi", Toast.LENGTH_SHORT).show()
}
}