๐ฉโโ๏ธ ๊ฐํธ์ฌ, ๊ฐํธ์ ๊ณตํ์๋ค์ ์ํ ์ปค๋ฎค๋ํฐ ์ดํ๋ฆฌ์ผ์ด์
๐จโโ๏ธ
[Android] ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ ๋ฐ ๋ด๋ถํ
์คํธ v1.0.1-beta๊น์ง ๊ตฌํํ ๋ด์ฉ
๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์
๋ก๊ทธ์ธ |
์๋ ๋ก๊ทธ์ธ |
ํ์๊ฐ์
|
|
|
|
- Retorofit2๋ฅผ ์ด์ฉํ ์๋ฒ ํต์ ์ผ๋ก ํ์๊ฐ์
, ๋ก๊ทธ์ธ ๊ตฌํ
- Coroutine, LiveData, Flow๋ฅผ ์ด์ฉํ ๋ฐ์ํ UI
- Shared Preferences๋ก ํค-๊ฐ ํํ๋ก Bearer token์ ์ ์ฅํด ์๋ ๋ก๊ทธ์ธ
4๊ฐ์ ๋ค๋น๊ฒ์ด์
ํญ
- Navigation์ ํตํด ๋ฐํ
๋ค๋น๊ฒ์ด์
๋ทฐ๋ฅผ ์ด์ฉํ ํ๋๊ทธ๋จผํธ ์ ํ ๊ฐ๋ฅ
- ๋ฉ์ธ ํ๋ฉด๊ณผ ์บ๋ฆฐ๋ ํ๋ฉด์ ๊ธฐ๋ฅ๊ณผ ๋์์ธ์ ๋ณด์ํด ์ถํ ์
๋ฐ์ดํธ ์์
- ํ๊ฒฝ์ค์ ํญ๋ ๋ก๊ทธ์์ ์ธ์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ์
๋ฐ์ดํธ ์์
๊ฒ์ํ ๋ฐ ๊ฒ์๊ธ ์์ฑ / ์ญ์ ๋ฑ์ ํ๋
๊ฒ์ํ |
๊ฒ์๊ธ ์์ฑ |
๊ฒ์๊ธ ์ญ์ |
|
|
|
- SwipeRefreshLayout์ ํตํด swipe์ ์๋ฒ์์ ์ต์ ๋ฆฌ์คํธ๋ฅผ ์๋ก ๋ถ๋ฌ์ ์ถ๋ ฅ
- ๋ฌดํ ์คํฌ๋กค -> ์คํฌ๋กค์ด ์ตํ๋จ์ ๋๋ฌํ๋ฉด ๋ถ๋ฌ์จ ๋ง์ง๋ง ๊ฒ์๊ธ ์์ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ ์ดํ์ ๊ฒ์๊ธ ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐ๋ก ๋ถ๋ฌ์ด
- ์๋ฒ์์ ํต์ ์ฑ๊ณต ์๋ต์ ๋ฐ๊ธฐ ์ ๊น์ง ProgressBar๋ฅผ ํฌํจํ ๋ ์ด์์์ includeํ๊ฑฐ๋ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋์ ๋ก๋ฉ ํ๋ฉด ๊ตฌํ
๊ฒ์๊ธ ๊ณต๊ฐ / ์คํฌ๋ฉ / ์ ๊ณ ๋ฐ ๋๊ธ
๊ฒ์ํ ์ข์์ / ์คํฌ๋ฉ / ์ ๊ณ |
๋๊ธ ์์ฑ ๋ฐ ์ญ์ / ์ข์์ |
|
|
- ๊ฒ์๊ธ ๋๋ ๋๊ธ ์ข์์ ์ ํ๋ฉด ๋ด ์ข์์ ์ซ์ + 1
- ํ๋ฉด ์คํฌ๋กค ์กฐ์
object ScrollViewUtils {
// ํด๋น ๋ทฐ๊น์ง ์คํฌ๋กค์ ๋ถ๋๋ฝ๊ฒ ์ด๋
fun NestedScrollView.smoothScrollToView(view: View, marginTop: Int = 0) {
val y = calculateDistance(view) - marginTop
ObjectAnimator.ofInt(this, "scrollY", y).apply {
duration = 1000L
}.start()
}
// ์คํฌ๋กค๋ทฐ์ ํด๋น ๋ทฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
private fun NestedScrollView.calculateDistance(view: View): Int {
return kotlin.math.abs(
calculateView(this).top - (this.scrollY + calculateView(
view
).top)
)
}
// ์คํฌ๋ฆฐ ๋ด์ ๋ทฐ ์ ๋ ์ขํ ๊ณ์ฐ
private fun calculateView(view: View): Rect {
val location = IntArray(2)
view.getLocationOnScreen(location)
return Rect(
location[0],
location[1],
location[0] + view.measuredWidth,
location[1] + view.measuredHeight
)
}
}
- ์คํฌ๋กค ์ด๋ ์์๋ ๋ณด์ด๊ฒ ํ๊ณ ์ถ์ ๋๊ธ ๋ทฐ ์์น๋ฅผ ๊ณ์ฐํด ์ ์ ํ ์์น๋ก 1์ด ๋์ ๋ถ๋๋ฝ๊ฒ ์ด๋
- ์๋ก์ด ๋๊ธ ์์ฑ ์ ํ๋ฉด ๋งจ ํ๋จ์ผ๋ก ์คํฌ๋กค ์ด๋
- ๋๋๊ธ์ ๋ฌ๊ธฐ ์ํ ๋๊ธ ์ ํ ์ ์ ํํ ๋๊ธ์ด ํค๋ณด๋ ์๋ก ๋ณด์ด๋๋ก ์คํฌ๋กค ์ด๋
- ์๋ก์ด ๋๋๊ธ ์์ฑ ์ ํด๋น ๋๋๊ธ์ด ํ๋ฉด์ ๋ณด์ด๋๋ก ์คํฌ๋กค ์ด๋
๊ฒ์๊ธ ๊ฒ์ ๋ฐ ์ด๋ฏธ์ง ์๋ณธ ๋ณด๊ธฐ
๊ฒ์๊ธ ๊ฒ์ |
์ด๋ฏธ์ง ์๋ณธ ๋ณด๊ธฐ |
|
|
- Coroutine๊ณผ Job์ ์ด์ฉํด EditTex์ ์ค์๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์งํ์ฌ ๊ฒ์ํ๋ Instant Search ๊ตฌํ
- ๋ชจ๋ ์ฟผ๋ฆฌ์ ๋ณํ๋ฅผ ๊ฐ์งํด call์ ๋ณด๋ด๊ณ return์ ๋ฐ์ผ๋ฉด ๋์์ด ๋ฌด๊ฑฐ์์ง๊ณ ์ ํํ ์ฟผ๋ฆฌ ๊ฒ์์ด ์ด๋ฃจ์ด์ง์ง ์์ ์ ์์ด์ rxJava์ debounce์ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋๋ก 0.5์ด ๋๋ ์ด๋ฅผ ์ฃผ์ด ๋์ ์ํ
- ViewPager2๋ฅผ ์ด์ฉํด ๊ฒ์๊ธ ์ด๋ฏธ์ง์ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ผ์ด๋ ํํ๋ก ์กฐํ ๊ตฌํ
์ฌ์ฉ์ ๊ฒ์๊ธ ํ๋
- ๋ด๊ฐ ์ด ๊ธ / ๋๊ธ ๋จ๊ธด ๊ธ / ์คํฌ๋ฉํ ๊ธ ํ์ธ ๊ฐ๋ฅ
ํ๊ฒฝ์ค์ - ๋ก๊ทธ์์
- ํ๊ฒฝ์ค์ ๋ค๋ฅธ ๊ธฐ๋ฅ ์ถ๊ฐ ๊ตฌํ ์์
+) ์บ๋ฆฐ๋ (๋์์ธ ์์ ํ์)
์ค์ผ์ค ์กฐํ |
๊ทผ๋ฌด ํ์
์ถ๊ฐ |
์ค์ผ์ค ํธ์ง ๋ชจ๋ |
|
|
|
- Realm์ ์ฌ์ฉํด ๋ก์ปฌ DB ๊ตฌ์ฑ
- CalendarViewPager๋ก ์บ๋ฆฐ๋ ํ๋ฉด ๊ตฌ์ฑ
- ๊ทผ๋ฌด ํ์
์ถ๊ฐ ์, ๊ทผ๋ฌด ํ์
ํ์ดํ๊ณผ ์๊ฐ์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ฉด DB์ Shift๊ฐ ์ ์ฅ๋๊ณ ๋ฐ๋ก ๋ฆฌ์ฌ์ดํด๋ฌ ๋ทฐ์ ๋ฐ์
- ์ค์ผ์ค ํธ์ง ๋ชจ๋์์๋ ํ๋จ ๊ทผ๋ฌด ํธ์ง ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ํตํด ์ฐ์์ผ๋ก ์ค์ผ์ค ์ถ๊ฐ๊ฐ ๊ฐ๋ฅ
targetSdkVersion 30 / minSdkVersion 21