๊ณณ๊ฐ์์ ์ธ์ฌ๋๋ค/์ค๋ฌด (20) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [Android][Open Source License] ์คํ์์ค ๋ผ์ด์ผ์ค ๋ฆฌ์คํธ ์ ๊ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์ ์คํ์์ค ๋ผ์ด์ผ์ค ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํด์ผ ํ๋ค. ์ฌ์ด ๋ฐฉ๋ฒ ์๋? ์๊ฒ๋ ๊ฒ ๊ตฌ๊ธ ํ๋ ์ด์์ ์คํ์์ค ์๋์ผ๋ก ํ์ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ https://developers.google.com/android/guides/opensource?hl=ko ์คํ์์ค ๊ณ ์ง ํฌํจ | Google Play services | Google for Developers ์ด ํ์ด์ง๋ Cloud Translation API๋ฅผ ํตํด ๋ฒ์ญ๋์์ต๋๋ค. Switch to English ์คํ์์ค ๊ณ ์ง ํฌํจ ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฅํ์ธ์. Google Play ์๋น์ค์๋ developers.google.com ์ง์ง ์ฌ์ฉํ๊ธฐ ์ฝ๋ค. ์ ๋ง ํธํ๋ค. [Android][TextView] marquee ์ค์ ๋ฌธ์ TextView์ marquee ์ค์ ๊ฐ์ด ๋จนํ์ง ์์ android:ellipsize="marquee" ์ ์ ๋จนํ๊น... ์ฐธ๊ณ https://stackoverflow.com/questions/3332924/textview-marquee-not-working [Android][Java] ์ด์ฑ ๊ฒ์ ๋ฌธ์ ์ด์ฑ ๊ฒ์ ๊ธฐ๋ฅ์ด ํ์ํ๋ค ์ถ์ฒ https://milkissboy.tistory.com/32 https://jhb.kr/122 ๋ ๋ฒ์งธ ์ถ์ฒ๋ฅผ ์ฌ์ฉํ๋ค. ๊ฐ์ฌํฉ๋๋ค. ๐โ๏ธ๐โ๏ธ๐โ๏ธ ์์์๋ถ ํ์ํ์๊ณ ๊ฑด๊ฐํ์๊ธธ ๋ฐ๋๋๋ค. [Android][Compose] Compose Canvas๋ฅผ ์ด์ฉํด์ Dot Indicator ๋ง๋ค๊ธฐ ๋ชฉ์ Compose์ Canvas๋ฅผ ์ด์ฉํด์ View Pager์ ๊ฐ์ด ์ธ Dot Indicator ๋ง๋ค๊ธฐ. ์๊ตฌ์ฌํญ R_1. ์ด ์ธ๋์ผ์ดํฐ๋ modifier.align ์ ํตํด ์ผํฐ ์ ๋ ฌ์ ํ๋ค. R_2. dot์ ๊ธฐ๋ณธ์ผ๋ก ์ํ์ด๋ค. ํ์ฌ ํ์ด์ง๋ฅผ ๋ํ๋ด๋ dot์ ๊ฐ๋ก๋ก ๊ธธ์ญํ๊ฒ ๋์ด์ ธ ์๋ ๋ผ์ด๋์ฒ๋ฆฌ๋ ์ง์ฌ๊ฐํ์ด๋ค. ์ฝ๋ / ๊ตฌํ @Composable fun BoxScope.DotIndicator( modifier: Modifier = Modifier, pagerState: PagerState, dotSpace: Dp = 4.dp, dotSize : Dp = 5.dp, currentDotWidth : Dp = 12.dp, listSize: Int, currentPageDotColor: Color =.. [Android][DataStore] DataStore ๋๊ธฐ์ ์ผ๋ก ์ฐ๊ธฐ ์ฐธ๊ณ https://developer.android.com/topic/libraries/architecture/datastore#synchronous ๋ชฉํ DataStore์ ์ ์ฅ ๊ฐ์ suspend fun ๋ฐ๊นฅ์์ ๋ถ๋ฌ์ค๊ณ ์ถ์๋ค. (์ด๊ฑด ๊ฒฐ๊ตญ์ DataStore๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ฐ๊ณ ์ถ๋ค๋ ์๋ฏธ๋ผ์ ์ ๋ชฉ์ ๊ทธ๋ ๊ฒ ๋ฃ์๋ค) ๊ธฐ์กด runBlocking์ ์จ์ DataStore์ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ๋ ํ์๋ค. ๊ทธ๋ฌ๋ runBlocking์ด UI thread๋ฅผ blockํ๋ ๊ฑฐ๋ผ ANR ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ํ๋๊น, ๊ณต์๋ฌธ์๋ฅผ ์ดํด๋ณธ๋ค. ๊ณต์ ๋ฌธ์ ํ์ธ ์ฌ๊ธฐ๋ณด๋ฉด DataStore๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ๋ฆฌ๋ก๋ฉํ๋ฉด ANR ์ด์๋ฅผ ์ค์ผ ์๋ ์๋ค๊ณ ํ๋ค. ๊ฒฐ๊ณผ ๊ณต์ ๋ฌธ์์์ ์๋ ค์ฃผ๋ ๋ฐฉ๋ฒ 1. runBlocking์ ์จ๋ผ. 2.. [Android]์ฑ ๋น๋ ์ค์ - zero base ํ๋ก์ ํธ ๊ฐ๋ฐ ์ ๋ด์ฉ ์ ๋ฆฌ์ ํ์์ฑ์ ๋๋ ๊ฒ๋ค ์ฐธ๊ณ https://stackoverflow.com/a/36455983 https://developer.android.com/studio/publish/app-signing?hl=ko#secure-shared-keystore ๋ฌธ์ ์์ฑ ํ์์ฑ ๊ธํ๊ฒ zero base ํ๋ก์ ํธ๋ฅผ ๋๊ฒจ๋ฐ์์ ์ผ์ ํ์์. ์ด๊ฒ ์ ๊ฒ ๋น๋ ๊ด๋ จํด์ ์ค์ ํด์ผํ๋ ๊ฑด ์๋๋ฐ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ๋ค์ ํ์คํ๊ฒ ์๊ฐ์ด ๋์ง ์์ ๋ค ๊ฒ์ํ๋ฉฐ ์ฐพ์์ผ ํ์. ์ด๋ฒ์ ์ ๋ฆฌํด์ ๋ค์ ๋ฒ์ ๋๋ฝ ์ฌํญ ์์ด, ๋ ํค๋งค๋ฉด์ ๋น ๋ฅด๊ฒ ์์ ํ๊ธฐ ์ํด ๊ธฐ๋กํจ. ๊ธฐ๋ก ๋์ apk, aab ํ์ผ ์ด๋ฆ ์๋ ์์ฑ flavor/type ๋ณ ์ค์ flavor/type ๋ณ ์ฌ์ด๋ ํค ์๋ ์ค์ flavor/type ๋ณ ์ฑ ์ด๋ฆ ์๋ ์ค์ ๋ฆด๋ฆฌ์ฆ ๋ฒ์ ์ค์ buildF.. [Android][Compose][์ฝ์ง ๊ตํ] Compose Migration + Expandable List ์์ ๊ธฐ์กด ํ๋ก์ ํธ๋ ์์ง๋ deprecated ๋ jcenter repository์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฐ๊ณ ์๋ค. Gradle 8.0์ ๊ธฐ๋ฅ์ ์จ์ ํ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ jcenter์ ๋ฌผ๋ฆฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ต์ฒดํด์ผ ํ๋ค. ๊ต์ฒด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ExpandedRecyclerView๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค. ์ฑ์์ ๋ง์ด ์ฐ์ด๋ ๊ธฐ๋ฅ๋ ์๋๊ณ , ์ฝ๊ด ์ค๋ช ์ ์ํด ๊ฐ๋จํ ์ฐ์ด๋ ๊ฒ ๋ฟ์ด๋ผ์ ์ง์ ๋ง๋ค๊ธฐ๋ก ํ๋ค. Compose๋ก ๋ง๋๋ ๊ฒ ๋ ๊ฐ๋จํ ๊ฒ ๊ฐ์์ ์์ํ๋ค. Gradle ์ค์ ์ฐธ๊ณ : https://velog.io/@blucky8649/Android-%EA%B8%B0%EC%A1%B4-%EC%95%B1%EC%97%90-Compose-UI-%EC%A0%81%EC%9A%A9-%EC%8B%9C%E.. [Kotlin] Calendar extensions ๊ฐ๋จ val Calendar.year: Int get() = this.get(Calendar.YEAR) val Calendar.month: Int get() = this.get(Calendar.MONTH) val Calendar.day: Int get() = this.get(Calendar.DAY_OF_MONTH) val Calendar.dayOfWeek: Int get() = this.get(Calendar.DAY_OF_WEEK) ์ด์ 1 2 3 ๋ค์