#1 ๊ฐ์
Modifier.imePadding()์ ํตํด์, BottomBar๊ฐ ๊น๋ํ๊ฒ ๋์ํ๊ฒ ๋ง๋๋ ์ํ์ฐฉ์ค๋ฅผ ๊ธฐ๋กํ๋ค.
#2 ์ํ์ฐฉ์ค 1
#2-1 ์ฝ๋
Scaffold(
modifier = Modifier.fillMaxSize(),
topBar = {
MainTopBar()
}
) { innerPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
) {
MainContent(
modifier = Modifier
.fillMaxWidth()
.weight(1f)
)
MainBottomBar(
modifier = Modifier
.fillMaxWidth()
.background(Color.LightGray)
.padding(8.dp)
)
}
}
๊ฐ๋จํ ์ฝ๋๋ค. MainBottomBar()๋ฅผ Scaffold์ ํ๋กํผํฐ์ ๋ฃ์ง ์์ ์ด์ ๋, BottomSheetScaffold()๋ฅผ ์ฌ์ฉํ ์๋ ์๊ธฐ ๋๋ฌธ์ด์๋ค. BottomSheetScaffold()๋ BottomBar๋ฅผ ๋ฐ๋ ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค.
#2-2 ์คํฌ๋ฆฐ์ท
TextField์ ์๋์ชฝ 8.dp ํจ๋ฉ์ด ๊ฐ๋ ค์ง๋ค. ์๋ํ๋ฉด, ๊ฐ์ํค๋ณด๋(ime)๊ฐ TextField๋ฅผ ๋ฐ์ด์ฌ๋ ธ๊ธฐ ๋๋ฌธ์ด๋ค. TextField์ ์๋์ชฝ ํจ๋ฉ์ TextField๋ก ์ทจ๊ธ๋์ง ์๊ธฐ ๋๋ฌธ์ ime๊ฐ ๋ฐ์ง ์๊ณ ๊ทธ๋ฅ ๊ฐ๋ ค๋ฒ๋ฆฐ๋ค. ๋๋ ์ด ๋ถ๋ถ์ด ๋ง์์ ๋ค์ง ์์๋ค. ๊ฒ๋ค๊ฐ Scaffold์ topBar ๋ํ ๋ฐ๋ ค ์ฌ๋ผ๊ฐ๋๊ฒ ์ซ์๋ค.
#3 ์ํ์ฐฉ์ค 2
#3-1 ์ฝ๋
Scaffold(
modifier = Modifier
.fillMaxSize()
.imePadding(), /* ์ถ๊ฐ! */
topBar = {
MainTopBar()
}
) { innerPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
) {
MainContent(
modifier = Modifier
.fillMaxWidth()
.weight(1f)
)
MainBottomBar(
modifier = Modifier
.fillMaxWidth()
.background(Color.LightGray)
.padding(8.dp)
)
}
}
Scaffold์ modifier์ Modifier.imePadding()์ ์ถ๊ฐํ๋ค. ime๋งํผ์ ํจ๋ฉ์ ์ค์ผ๋ก์จ Scaffold๊ฐ ime์ ์ํด ๋ฐ๋ ค ์ฌ๋ผ๊ฐ๋๊ฒ ์๋๋ผ, Scaffold์ ๋์ด๋ฅผ ์ค์ฌ ime์ ์ํ ๊ณต๊ฐ์ ๋น์๋๊ฒ ๋ง๋ ๊ฒ์ด๋ค.
#3-2 ์คํฌ๋ฆฐ์ท
์คํฌ๋ฆฐ์ท์ผ๋ก๋ณด๋ฉด ๊น๋ํ์ง๋ง, ๋ฌธ์ ๋ ์ ๋๋ฉ์ด์ ์ด๋ค. ์๋ ๋์์์ ๋ณด์.
#3-3 ๋์์
๋ญ๊ฐ Compose Runtime๊ณผ ์กฐํ๋ฅผ ์ด๋ฃจ์ง ๋ชปํ๊ณ ์๋ค. #2-2์์ ๋ณธ ์์คํ ์ ์ผ๋ก ime๊ฐ TextField๋ฅผ ๋ฐ๊ณ ์ฌ๋ผ๊ฐ๋ ๋์๊ณผ์ ์ถฉ๋์ด ์ผ์ด๋ ๋ชจ์์๋ค. ์๋ํ๋ฉด topBar๊ฐ ๋ช ํ๋ ์ ๋์์ ์์คํ ์ฐฝ์ ๋ซ๊ณ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค (ํจ๋ฉ์ ์ค์ ํ๋ ๊ฒ๋ง์ผ๋ก ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋ ์ ์๋ค). ์ด ๊ธฐ๋ณธ ๋์์ ์ปจํธ๋กคํด์ผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ค.
#4 ํด๊ฒฐ
#4-1 ์ฝ๋
...
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
setContent {
...
}
}
}
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)์ ํตํด์, ์ฐฝ(Window)์ด ime ํธ์ถ์ ์์ง์ด์ง ์๊ฒ ๋ง๋ค์๋ค. ์ฆ #3-3์ ๊ธฐ๋ณธ ๋์์ ์ ๊ฑฐํ ๊ฒ์ด๋ค.
#4-2 ๋์์
๊น๋ํ๊ฒ ๋์ํ๋ค.
#5 ๊ตฌ์กฐ ๊ณต๋ถ - Window
Window์ Activity์ 1:1 ๊ด๊ณ
ํ๋์ Activity๋ ํ๋์ Window ๊ฐ์ฒด๋ฅผ ํตํด ํ๋ฉด์ ํ์ํ๋ค. ํ๋์ Activity๊ฐ ํ๋์ Window ๊ฐ์ฒด์ 1:1 ๋งค์นญ๋๋ค. Window๋ ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ์ ์ต์์ ์ปจํ ์ด๋์ธ DecorView๋ฅผ ๊ด๋ฆฌํ๋ค.
Window๋ ๋ฒ์ฉ์ ์ธ ๋จ์
๊ทธ๋ ๋ค๊ณ Window๊ฐ Activity์ ์ ์ฉ ๊ฐ๋ ์ธ ๊ฒ์ ์๋๋ค. Window๋ UI๋ฅผ ํ๋ฉด์ ํ์ํ๊ธฐ ์ํ ๋จ์์ผ ๋ฟ์ด๊ณ , ์ด Window๋ ๋ค์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ค. ๊ฐ๋ น Toast ๋ฉ์์ง, Dialog ๋ฑ๋ ํ๋์ Window๋ฅผ ๋ณด์ ํ๋ค. WindowManager๋ฅผ ํตํด์ (Toast ๋ฉ์์ง๋ Dialog ๋ฑ์) Window๋ฅผ ํ๋ฉด์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํด๋ณธ ๊ธฐ์ต์ด ์์ ๊ฒ์ด๋ค.
WindowInsets
WindowInsets๋ ์ด๋ฏธ ํ์๋ Window ์์ View๋ค์ด ์์คํ UI๋ก๋ถํฐ ์นจ๋ฒ(inset)๋นํ ์์ญ์ ์ ์ ์๊ฒ ํด์ฃผ๋ ์ ๋ณด๋ฅผ ๋ด์ ํด๋์ค๋ค. ์ํ๋ฐ๋ ๋ค๋น๊ฒ์ด์ ๋ฐ๊ฐ ์๋ก ๋ค ์ ์๋ค. Inset์ ๋ช ์ฌ๋ก๋ '์ฝ๋'์ ์๋ฏธ๋ค. '์ฝ๋'๋, ํฐ ์ง๋ ์์ ์๋ ์์ ์ง๋๋ฅผ ์๋ฏธํ๋ค. ์ฐ๋ฆฌ๋๋ผ ์ ๋ ์ ์๋ฆ๋ใ๋ ๋๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ๋๋ค. ์๋ฆ๋ใ๋ ๋๋ ์ข ์ด์ ์๋ฆฌ๊ฐ ๋ถ์กฑํด์ ์ฝ๋๋ก ํ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋งํฌ ๋ชจ์
๊ณต์ ๋ฌธ์์ ๋งํฌ๋ค.
#6 ์์ฑ๋ ์ฑ (์์ค ์ฝ๋)
android-practice/playground/ImePadding at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
์ ์ฒด ์์ค ์ฝ๋๊ฐ ํ์ํ๋ค๋ฉด ์ฌ๊ธฐ์ ๋ค์ด๋ก๋ํ์.