๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ’ป 51

[Android] BottomSheet๋ฅผ Soft Keyboard์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ 1

#1 ๊ฐœ์š”์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋งˆํŠธํฐ์˜ Soft Keyboard๋Š”, (์ด๋ชจํ‹ฐ์ฝ˜์„ ํฌํ•จํ•œ) ๋ฌธ์ž์—ด ์ž…๋ ฅ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ '๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์ •๋ณด ์ž…๋ ฅ'์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด Keyboard๋ฅผ ๋งŒ๋“ค ์—ฌ์ง€๊ฐ€ ์ƒ๊ธด๋‹ค. BottomSheetScaffold์˜ BottomSheet๋ฅผ ์ƒˆ๋กœ์šด Keyboard๋ฅผ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ• ๋งŒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” ์นด์นด์˜คํ†ก์—์„œ ์–ป์—ˆ๋‹ค. ์ง€๊ธˆ ํ•œ๋ฒˆ ์นด์นด์˜คํ†ก์„ ์‹คํ–‰์‹œ์ผœ์„œ (๋ˆ์ฃผ๊ณ  ์‚ฌ์•ผํ•˜๋Š”) ์ด๋ชจํ‹ฐ์ฝ˜์„ ์ž…๋ ฅํ•ด๋ณด๋ผ. ๊ทธ ์ด๋ชจํ‹ฐ์ฝ˜๋“ค์€ BottomSheet์— ๋‹ด๊ฒจ์žˆ๋‹ค. #2 ๋ฒ ์ด์Šค ์ฝ”๋“œ#2-1 ๋ ˆํผ๋Ÿฐ์Šค [Android] BottomSheetScaffold์˜ BottomSheet๊ฐ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ๋Š” ์ˆจ๊ฒจ์ง€์ง€ ์•Š์ง€๋งŒ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ๋Š”#1 ๋ฌธ์ œ ์ƒํ™ฉ#1-1 ์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ ์ˆจ๊ฒจ์ง€์ง€ ..

[Android] BottomSheetScaffold์˜ BottomSheet๊ฐ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ๋Š” ์ˆจ๊ฒจ์ง€์ง€ ์•Š์ง€๋งŒ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ๋Š” ์ˆจ๊ฒจ์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ

#1 ๋ฌธ์ œ ์ƒํ™ฉ#1-1 ์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ ์ˆจ๊ฒจ์ง€์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๊ธฐval scaffoldState = rememberBottomSheetScaffoldState( bottomSheetState = rememberStandardBottomSheetState( skipHiddenState = true ))์ด๋Ÿฌ๋ฉด ๋œ๋‹ค. ์‚ฌ์‹ค skipHiddenState๋Š” ๊ธฐ๋ณธ๊ฐ’์ด true๊ธฐ์— ๊ทธ๋ƒฅ val scaffoldState = rememberBottomSheetScaffoldState()๋งŒ ์จ๋„ ๋˜๊ธด ํ•œ๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์˜ ์ฝ”๋“œ๋Š” ๊ธฐ๋ก์˜ ์˜๋ฏธ๊ฐ€ ๊ฐ•ํ•˜๋ฏ€๋กœ, ๊ทธ๋ƒฅ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐํ˜€ ์ผ๋‹ค. #1-2 ๋ฌธ์ œ์ FilledTonalButton( onClick = { scope.launch { ..

Pagination ์ธํ„ฐํŽ˜์ด์Šคใ†๊ตฌํ˜„ใ†๊ฒ€์ฆ์šฉ ์•ฑ

#1 Pagination ํด๋ž˜์ŠคPagination ํด๋ž˜์Šค๋Š” ์ „์ฒด ๊ฒŒ์‹œ๊ธ€ ๊ฐฏ์ˆ˜, ํ•œ ํŽ˜์ด์ง€์— ํ‘œ์‹œํ•  ๊ฒŒ์‹œ๊ธ€ ๊ฐฏ์ˆ˜, ํ•œ ํŽ˜์ด์ง€ ๋ธ”๋Ÿญ์— ํ‘œ์‹œํ•  ํŽ˜์ด์ง€๋“ค์˜ ๊ฐฏ์ˆ˜์— ๊ธฐ๋ฐ˜ํ•ด ๊ฒŒ์‹œํŒ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค๋‹ค. ์˜ˆ์ „์— ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค ๋•Œ ์ฒ˜์Œ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ๋„ 2 ~ 3๋ฒˆ ์ •๋„ ๋‹ค์‹œ Pagination ํด๋ž˜์Šค๋ฅผ ์žฌ์ž‘์„ฑํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋น„ํšจ์œจ์ ์ธ๊ฐ€! ๊ทธ๋ž˜์„œ ์ด์ฐธ์— ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ๊ธฐ๋กํ•ด๋‘๋ ค ํ•œ๋‹ค. ์•ž์œผ๋กœ Pagination ํด๋ž˜์Šค๋Š” ๋ณธ ๊ฒŒ์‹œ๊ธ€์˜ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. #2 ๊ธฐ๋ณธ ์ฝ”๋“œ#2-1 ์ธํ„ฐํŽ˜์ด์Šค// by interfacer_han (https://kenel.tistory.com/327)/*(example) goToFirstPageBlockButton: (example) g..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - NutrientBottomSheet ๋ถ€๋ถ„ ๊ตฌํ˜„

#1 ๊ฐœ์š” Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ#1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ#1-1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ๊ตฌํ˜„#1 ๊ฐœ์š”#1-1 ์ง€๊ธˆ๊นŒ์ง€์˜ ์—ฌ์ • Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ดkenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์—์„œ ๋ชป๋‹คํ•œ ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.  #2 ์ฝ”๋“œ ์Šค๋‹ˆํŽซ#2-1 NutritionBottomSheet.kt...@Composablefun NutrientBottomSheet( viewModel: NutrientViewModel = hiltViewModel()) { val inputtedDayMeal = viewModel.nutrie..

Nutri Capture ๋ฐฑ์—”๋“œ - NutritionInfo ๋ฆฌํŒฉํ† ๋ง

#1 ๋ฌธ์ œ์ #1-1 ๋ฆฌํŒฉํ† ๋งํ•  ๊ธฐ์กด ์ฝ”๋“œpackage com.example.nutri_capture_new.dbimport androidx.room.ColumnInfodata class NutritionInfo( // ๊ณผ์‹ ์ •๋„๊ฐ’ @ColumnInfo(name = "overeating_excess") var overeatingExcess: Int = 0, // ์ •์ œ๋‹น ์„ญ์ทจ ์ •๋„๊ฐ’ @ColumnInfo(name = "refined_sugar_excess") var refinedSugarExcess: Int = 0, // ์ •์ œ ๊ณก๋ฌผ ์„ญ์ทจ ์ •๋„๊ฐ’ @ColumnInfo(name = "refined_grain_excess") var refinedGrainExcess..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ

#1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ#1-1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ๊ตฌํ˜„#1 ๊ฐœ์š”#1-1 ์ง€๊ธˆ๊นŒ์ง€์˜ ์—ฌ์ • Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ด์œ ๋ง๋กœ ์„ค๋ช…ํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ, BottomSheetScaffold์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ด์ง๋งŒ ๋ฐ”๊พธ๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™kenel.tistory.com์ด์ „์— ๋งŒ๋“  ์•„์ด์ฝ˜์ด๋‹ค. ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ, ์šฐ์„  ๋ณธ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ๋ถ€ํ„ฐ ํ•ด๋ดค๋‹ค. #1-2 ์ž„์‹œ ์ ์šฉ ์ฝ”๋“œ...@Composablefun NutrientBottomSheet( viewModel: NutrientViewModel = hiltViewModel()) { val inputtedDayMeal = view..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ๊ตฌํ˜„

#1 ๊ฐœ์š”#1-1 ์ง€๊ธˆ๊นŒ์ง€์˜ ์—ฌ์ • Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ด์œ ๋ง๋กœ ์„ค๋ช…ํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ, BottomSheetScaffold์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ด์ง๋งŒ ๋ฐ”๊พธ๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  internal์ด๋‚˜ private ์ ‘๊ทผ ์ง€์ •์ž๊ฐ€ ๋ถ™์€ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋‚ดkenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์—์„œ ๋ณด๋“ฏ, ์›๋ž˜๋Š” ์˜์–‘ ์ •๋ณด ์ž…๋ ฅ์„ ์œ„ํ•œ ์ปค์Šคํ…€ ํ‚ค๋ณด๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ์—ˆ๋‹ค. ์ด ์ปค์Šคํ…€ ํ‚ค๋ณด๋“œ๋Š” BottomSheetScaffold์˜ BottomSheet์— ๋“ค์–ด๊ฐˆ ์˜ˆ์ •์ด์—ˆ๋‹ค. ์ˆœ์ • BottomSheetScaffold๋กœ๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ปค์Šคํ…€ BottomSheetScaffold๋ฅผ ๋งŒ๋“ค..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ

#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ด์œ ๋ง๋กœ ์„ค๋ช…ํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ, BottomSheetScaffold์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ด์ง๋งŒ ๋ฐ”๊พธ๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  internal์ด๋‚˜ private ์ ‘๊ทผ ์ง€์ •์ž๊ฐ€ ๋ถ™์€ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ์ปค์Šคํ…€ํ•  ์ˆ˜๋„ ์—†๋Š” ๋…ธ๋ฆ‡์ด์—ˆ๋‹ค. publicํ•œ ํ•จ์ˆ˜๋“ค๋กœ ๊ตฌํ˜„๋„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฑธ ํ•ด๋ดค๋‹ค. ๊ฒฐ๊ตญ ๊นŠ์ˆ™ํžˆ ํŒŒ๊ณ ๋“ค์–ด๋ณธ ๊ฒฐ๊ณผ, ๋ฐ˜๋“œ์‹œ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์•ผ๋งŒ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ์ •ํ™•ํžˆ๋Š”, NestedScrollConnection์˜ ๊ธฐ์ œ๋ฅผ ์•Œ๊ฒŒ๋˜๊ณ ๋‚˜์„œ ๊นจ๋‹ฌ์•˜๋‹ค. ์ˆœ์ • BottomSheetScaffold์— ๊ฐ€ํ•ด์ง€๋Š” ์‚ฌ์šฉ์ž์˜ ํ„ฐ์น˜ ์ž…๋ ฅ(Pointer input)์€ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ(์ธ ๋‚ด๋ถ€ ์ฝ”๋“œ)๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋Š”๋ฐ, ์ด๋ฅผ ๋ง‰์„ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋œ ๊ฒƒ์ด๋‹ค...

Nutri Capture ๋ฐฑ์—”๋“œ - Hilt ๋„์ž…

#1 ๊ฐœ์š”#1-1 Hilt ๋„์ž…๊ณ„ํšํ‘œ ์ƒ, Hilt ๋„์ž…์€ ๋์ž๋ฝ ๋‹จ๊ณ„์˜€๋‹ค. ํ•˜์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ์งœ๊ฐ€๋ฉฐ ์•ฑ์„ ๊ตฌํ˜„ํ•ด๋‚˜๊ฐ€๋Š” ๋ฐ์— ์—ฌ๋Ÿฌ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋“ค์ด ๋‚˜๋ฅผ ๊ฑฐ์Šฌ๋ฆฌ๊ฒŒ ํ–ˆ๋‹ค. Hilt๋กœ ํ˜„์กดํ•˜๋Š” ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ ๊ทธ๋ฆฌ๊ณ  ์ž ์žฌ์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋“ค์„ ์„ ์ œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ํŽธ์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋ž€ ํŒ๋‹จ์„ ๋‚ด๋ ธ๋‹ค. #1-2 ๊ธฐ๋ฐ˜ (๋ ˆํผ๋Ÿฐ์Šค) [Android] Dagger2 - Hilt๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜#1 Hilt ๊ฐœ์š” Hilt๋ฅผ ์‚ฌ์šฉํ•œ ์ข…์† ํ•ญ๋ชฉ ์‚ฝ์ž…  |  Android Developers์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Hilt๋ฅผ ์‚ฌ์šฉํ•œ ์ข…์† ํ•ญ๋ชฉ ์‚ฝ์ž… ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผkenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์— ๊ธฐ๋ฐ˜ํ•ด, ๋ณธ ์•ˆ๋“œ๋กœ์ด๋“œ์— Hilt๋ฅผ ๋„์ž…ํ•œ..

[Android] Hilt - java.lang.RuntimeException: Unable to instantiate application

#1 ๋ฌธ์ œ ์ƒํ™ฉ#1-1 Hilt ๋„์ž… [Android] Dagger2 - Hilt๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜#1 Hilt ๊ฐœ์š” Hilt๋ฅผ ์‚ฌ์šฉํ•œ ์ข…์† ํ•ญ๋ชฉ ์‚ฝ์ž…  |  Android Developers์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Hilt๋ฅผ ์‚ฌ์šฉํ•œ ์ข…์† ํ•ญ๋ชฉ ์‚ฝ์ž… ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผkenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์— ๊ธฐ๋ฐ˜ํ•ด, ๊ฐœ๋ฐœ ์ค‘์ธ ์•ฑ์— Hilt๋ฅผ ๋„์ž…ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. #1-2 Application ํด๋ž˜์Šคpackage com.example.nutri_capture_new.diimport android.app.Applicationimport dagger.hilt.android.HiltAndroidApp@HiltAndroidAppclass H..