๐ SeSAC์ 'JetPack๊ณผ Kotlin์ ํ์ฉํ Android App ๊ฐ๋ฐ' ๊ฐ์ข๋ฅผ ์ ๋ฆฌํ ๊ธ ์ ๋๋ค.
์กํฐ๋นํฐ๊ฐ ์ถ๋ ฅํ๋ ์ ์ฒด ํ๋ฉด์ Window
๋ผ๊ณ ํ๊ณ , ActionBar
์ Content
๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์ฌ๊ธฐ์ ActionBar
๋ ํ๋ฉด ์๋จ์ ํ์ดํ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ ์์ญ์ด๋ค.
์ฐ๋ฆฌ๊ฐ kt ํ์ผ์์ setContentView
๋ฅผ ์ฌ์ฉํ๋ ์๋ฏธ๋ฅผ ์ฌ๊ธฐ์ ์ ์ ์๋ค.
setContentView
๋ก Content
์์ญ์ ๊ฐ๋ฐ์๊ฐ ์์๋ก ์ ์ดํ ์ ์๋ ๊ฒ์ด๋ค.
ActionBar
๋ ๋ฐ๋ก ๋ช
๋ น์ ๋ด๋ฆฌ์ง ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ๋ ฅ๋๋ค. ์ด ๊ฒฝ์ฐ ํ์ดํ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค.
๋ฌผ๋ก ๊ฐ๋ฐ์๊ฐ ๊ตฌ์ฑ์์๋ฅผ ์ถ๊ฐ ํ ์ ์๋ค.
ํ์ดํ ๋ฌธ์์ด, ๋ค๋น๊ฒ์ด์ ์์ด์ฝ, ์ก์ ์์ดํ , ์ค๋ฒํ๋ก์ฐ ๋ฉ๋ด ๋ฑ
<- (๋ค๋ก๊ฐ๊ธฐ)
๋ฒํผ์ ๋ช
์นญ์ HomeAsUp
์ด๋ค.๊ธฐ๋ณธ์ ์ผ๋ก ์๋๋ก์ด๋ ํ๋ซํผ์์ ์ ๊ณตํ๋ API๋ก ์์ฑ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก androidx์์ ์ ๊ณตํ๋ appcompat
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค.
appcompat
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์กด์ฑ์ด ์ถ๊ฐ๋์ด ์๋ค. ๊ทธ ์ ๋๋ก ๊ธฐ๋ณธ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
์๋ก ์ ์ผ๋ก appcompat
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ณต ๋ชฉ์ ์ '์ดํ๋ฆฌ์ผ์ด์
๊ณผ ๊ด๋ จ๋์ด ์๋ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๊ธฐ ์ํจ' ์ด๋ค.
Activity๋ฅผ ์์ฑํ ๋ Activity
๊ฐ ์๋ AppCompatActivity
๋ฅผ ์์ ๋ฐ์ ์์ฑํ๋ ๊ฒ๋ง ๋ณด๋๋ผ๋ ์ ์ ์๋ ๋ถ๋ถ์ด๋ค.
class MainActivity : AppCompatActivity() {
private val binding by lazy { ActivityDetailBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
AppCompatActivity()
์ด appcompat
์์ ์ ๊ณต๋๋ ํด๋์ค์ด๋ค.ActionBar์ ์์์ ๊ธฐ๋ณธ์ ์ผ๋ก theme.xml
ํ์ผ์ ์ ์๋์ด ์๋ ์์์ผ๋ก ์ถ๋ ฅ๋๋ค.
๋ง์ฝ ActionBar์ ์์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด colorPrimary
์ต์
์ ์์ ํ๋ฉด๋๋ค.
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.AndroidLab" parent="Theme.Material3.DayNight.NoActionBar">
<item name="colorPrimary">@android:color/holo_purple</item>
</style>
<style name="Theme.AndroidLab" parent="Base.Theme.AndroidLab" />
</resources>
์ด ์ธ์๋ ์์์ ์ ์ดํ๋ ํค์๋๊ฐ ์๋ค.
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.AndroidLab" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">#FF0000</item>
<item name="colorPrimaryVariant">#FFFF99</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">#00FF00</item>
<item name="colorSecondaryVariant">#F999F0</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/color</item>
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
<style name="Theme.AndroidLab" parent="Base.Theme.AndroidLab" />
</resources>
ActionBar ์ฐ์ธก์ ๊ตฌ์ฑํ ์ ์๋ค.
Overflow Menu
์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด ์๋์ผ๋ก Overflow Button (์ 3๊ฐ)
์ด ์ถ๋ ฅ๋๋ค.
๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ์ฝ๋ค.
์กํฐ๋นํฐ ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ๋ฐ์์ ์์ฑํด ๋์ผ๋ฉด, ๋ฉ๋ด๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ์๋ ํธ์ถ ๋๋ค.
๊ทธ ์๋ ํธ์ถ๋๋ ํจ์๊ฐ onCreateOptionsMenu()
์ด๋ค.
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val menuItem1: MenuItem? = menu?.add(0, 0, 0, "menu1")
val menuItem2: MenuItem? = menu?.add(0, 1, 0, "menu2")
return super.onCreateOptionsMenu(menu)
}
์ฆ, onCreateOptionsMenu()
์ ์กํฐ๋นํฐ ํจ์์ด๋ฉฐ ๋ฉ๋ด ๊ตฌ์ฑ์ ์ํด ์๋ ์ฝ ๋๋ค.
๋งค๊ฐ๋ณ์๋ก Menu
๋ฅผ ๋ฐ๋๋ฐ, ์ด๋ฅผ ๋ฉ๋ด๋ฐ ์ ๋๋ก ์๊ฐํ๋ฉด ๋๋ค.
์ฐ๋ฆฌ๋ ๊ทธ์ ๋ฉ๋ด๋ฐ์ Menu
๋ฅผ ์ด์ฌํ add ํ๋ฉด ๋๋ค.
menu
์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๊ฐ ์๋ณ์์ด๋ค. ๋ฉ๋ด์ ์์ด๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ซ์๊ฐ์ผ๋ก ์ง์ ํ๊ณ , ์ด๊ฒ์ผ๋ก ์ด๋ค ๋ฉ๋ด๊ฐ ํด๋ฆญ ๋์๋์ง ๊ตฌ๋ถํ๋ค.
onOptionsItemSelected()
๋ผ๋ ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ๋ฐ์ ์์ฑํ๋ฉด ๋๋ค.
์ ์ ๊ฐ ๋ฉ๋ด๋ฅผ ์ ํ ์ ํด๋น ํจ์๊ฐ ์๋ ์ฝ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋งค๊ฐ๋ณ์๋ก ์ ํํ ๋ฉ๋ด๊ฐ ์ ๋ฌ๋๋ค.
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.ItemId) {
0 -> {
true
}
1 -> {
true
}
else -> super.onOptionsItemSelected(item)
}
package com.kotdev99.android.c37
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
// Menu ๊ตฌ์ฑ
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menu?.add(0, 0, 0, "menu1")
menu?.add(0, 1, 0, "menu2")
return super.onCreateOptionsMenu(menu)
}
// Menu ์ด๋ฒคํธ ์ฒ๋ฆฌ
// item.itemId ๋ก ๋ฉ๋ด๋ฅผ ๊ตฌ๋ถํ๋ค
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
0 -> {
Toast.makeText(this, "menu1 click", Toast.LENGTH_SHORT).show()
true
}
1 -> {
Toast.makeText(this, "menu2 click", Toast.LENGTH_SHORT).show()
true
}
else -> super.onOptionsItemSelected(item)
}
}
Menu๋ฅผ ๋ฆฌ์์ค๋ก์จ XML ๋ก ์ ์
์๊ฐํด ๋ณด๋ฉด ๋ฉ๋ด๋ผ๋ ๊ฒ์ด ์ ์ ์ธ ๊ตฌ์ฑ์ด ๋๋ถ๋ถ์ด๋ค. ๋๋ฌธ์ XML ๋ก ์ ์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu1"
android:title="menu1" />
<item
android:id="@+id/menu2"
android:title="menu2" />
</menu>
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return super.onCreateOptionsMenu(menu)
}
ActionBar์ ์์ด์ฝ์ผ๋ก ์ถ๋ ฅ๋๋ ๋ฉ๋ด
showAsAction
์์ฑ์ผ๋ก ์ง์
<item
android:id="@+id/menu2"
android:icon="@android:drawable/ic_menu_add"
android:title="menu2"
app:showAsAction="always" />
never : ํญ์ ์ค๋ฒํ๋ก์ฐ ๋ฉ๋ด๋ก ์ถ๋ ฅ (default)
ifRoom : ๋ง์ฝ ์ก์ ๋ฐ์ ๊ณต๊ฐ์ด ์๋ค๋ฉด ์ก์ ์์ดํ ์ผ๋ก, ์๋ค๋ฉด ์ค๋ฒํ๋ก์ฐ ๋ฉ๋ด๋ก ์ถ๋ ฅ
always : ํญ์ ์ก์
์์ดํ
์ผ๋ก ์ถ๋ ฅ
ActionBar์ ๋ด์ฅ ๋ทฐ
๋ทฐ๋ ๋ทฐ์ธ๋ฐ Content ๋ถ๋ถ์ ์ถ๋ ฅ๋๋ ๊ฒ์ด ์๋๋ผ ์ก์ ๋ฐ์ ๋ด์ฅ๋์ด ์๋ ๋ทฐ
๊ทธ๋ฐ๋ฐ ๋ฉ๋ด ๊ธฐ๋ฒ์ผ๋ก ์ค์ ํด ์ค์ผ ์ถ๋ ฅ๋๋ค. actionViewClass
์์ฑ์ผ๋ก ์ง์ ํ๋ค.
<item
android:id="@+id/menu_search"
android:title="search"
app:showAsAction="always"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
actionViewClass
์์ฑ์ ์ก์
๋ฐ์ ๋ด์ฅ๋์ด ์๋ ๋ทฐ ํด๋์ค๋ช
์ ์ฃผ๋ฉด ๋๋ค.res/menu ํ์์ Menu ๋ฆฌ์์ค XML ํ์ผ ์ ์
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu1"
android:title="menu1" />
<item
android:id="@+id/menu2"
android:icon="@android:drawable/ic_menu_add"
android:title="menu2"
app:showAsAction="always" />
<item
android:id="@+id/menu3"
android:icon="@android:drawable/ic_menu_search"
android:title="menu3"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always" />
</menu>
MenuInflater
๋ก ๋ฉ๋ด XML ํ์ผ์ ์ ์ฉ
package com.kotdev99.android.c38
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return super.onCreateOptionsMenu(menu)
}
}