Code With Joyce
@soja05246866
Students
7,612
Reviews
167
Course Rating
4.8
Posts
Q&A
๋์๋ณด๋ ์ค์ ๋ง์ง๋ง ๋จ๊ณ Google Play์ ์ฑ ๊ฒ์
์๋์, ๋ด๋ถ ๋ฐ ๋น๊ณต๊ฐ ํ ์คํธ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก ํ๋ก๋์ ์ฉ์ผ๋ก ๊ฐ์ํ ์๋ ์์ต๋๋ค.Play Console์ ์ด๊ณ ๋ฒ์ ์ ๋ง๋ค๋ ค๋ ํธ๋์ผ๋ก ์ด๋ํฉ๋๋ค. ๊ณต๊ฐ ํ ์คํธ(ํ ์คํธ > ๊ณต๊ฐ ํ ์คํธ)๋น๊ณต๊ฐ ํ ์คํธ(ํ ์คํธ > ๋น๊ณต๊ฐ ํ ์คํธ)๋ด๋ถ ํ ์คํธ(ํ ์คํธ > ๋ด๋ถ ํ ์คํธ)ํ๋ก๋์ ๋งจ ์๋ ํ๋ก๋์ ์ ๋๋ฌ์ฃผ์ธ์.
- Likes
- 0
- Comments
- 2
- Viewcount
- 690
Q&A
apirequest.io ๋ก๋ฉ ํ์ & ์ฌ์ดํธ ์ด์ํจ
์๋ ํ์ธ์! https://toolbox.http4k.org/dataclass ์ด ์ฌ์ดํธ์์ json์ ๋ฐ์ดํฐ ํด๋์ค๋ก ๋ณํํด๋ณด์ธ์.
- Likes
- 0
- Comments
- 1
- Viewcount
- 455
Q&A
roomDB์ ๋ฃ์ ๋ณ์ํ์ ๊ดํ ์ง๋ฌธ
์๋ ํ์ธ์, ํน์ ์ ๋ต๋ณ์ผ๋ก ํด๊ฒฌ์ด ๋์ จ์๊น์?
- Likes
- 0
- Comments
- 2
- Viewcount
- 446
Q&A
tvLocationTitle์ด Null์ด์์ ใ
์๋ ํ์ธ์, kbs๋~ ^^ํน์ null ์ด ๋ฐ ๋ Toast ๋ฌธ๊ตฌ๋ ๋ญ๋ผ๊ณ ๋์ค๋์?๊ทธ๋ฆฌ๊ณ ํ์ฌ if ๋ฌธ์ ๋ง์ด ์จ์ ์ด๋์ Null ์ด Return ์ด ๋๋์ง๋ฅผ ์ ํํ ์๋ฉด ์๋ฌ๋ฅผ ๊ณ ์น๋ ๋ฐ์ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. Log.d("Debug","์ฌ๊ธฐ 1"), Log.d("Debug","์ฌ๊ธฐ 2") ์ด๋ฐ ์์ผ๋ก ๋ถ๊ธฐ๋ง๋ค ๋ก๊ทธ๋ฅผ ์ฐ์ด์ ์ด๋์ null ์ด ๋ฐํ๋๋์ง ์๋ ค์ฃผ์ธ์. ๊ฐ์ด ์๋ฌ๋ฅผ ํด๊ฒฐํด๋ด์~ใ ใ ๊ฐ์ฌํฉ๋๋ค!
- Likes
- 0
- Comments
- 3
- Viewcount
- 635
Q&A
๋ณด๋ค๊ฐ ๊ถ๊ธํ๊ฒ์๊ฒจ์ ์ง๋ฌธ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์! ์คํ๋ ~ ^^ ์กฐ์ด์ค์ ๋๋ค. Kotlin, Java ์ ๊ฐ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์๋ ํ ์ด๋ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ชจ๋ธ ๊ฐ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.ORM(Object relational mapping)์ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑํ์ฌ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํด์ค๋๋ค. ์ฆ ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด์ง์. Room ์ด ๋ํ์ ์ธ ์๋๋ก์ด๋์ ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ, ๋ง์ํด์ฃผ์ ๊ฒ์ฒ๋ผ JPA, Hibernate, Mybatis๋ ๊ทธ ์ ์ค์ ํ๋๋ผ๊ณ ํ ์ ์์ต๋๋ค. ํจ์์ ์ด๋ฆ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ฌด์์ ์ ์ด์ฃผ์ ๋ ์๊ด ์์ต๋๋ค. ๋ํ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ์ถ์ผ์๋ค๋ฉด ์๋ ์์์ ๊ฐ์ด @Query("Query ๋ฌธ") ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ DB์ ์ ๊ทผ ํ ์๋ ์์ต๋๋ค. ๋ต๋ณ์ด ํ์ต์ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํน์ ์ถ๊ฐ์ ์ธ ์ง๋ฌธ ์์ผ์๋ฉด ๋จ๊ฒจ์ฃผ์ธ์.์ข์ ํ๋ฃจ ๋ณด๋ด์ธ์ :) @Dao interface TestDao { @Query("SELECT * FROM Test") fun getAll(): LiveData> @Query("SELECT * FROM task_table WHERE taskId = :key") fun get(key: Long): LiveData @Query("SELECT * FROM task_table ORDER BY taskId DESC") fun getAll(): LiveData> @Insert(onConflict = OnConflictStrategy.REPLACE) // ์ค๋ณต ID์ผ ๊ฒฝ์ฐ ๊ต์ฒด fun insert(todo: Test) @Update fun update(todo: Test) @Delete fun delete(todo: Test) }
- Likes
- 0
- Comments
- 2
- Viewcount
- 407
Q&A
Geocoder getFromLocation ์๋ฌ
์๋ ํ์ธ์! ์กฐ์ด์ค์ ๋๋ค. ์ง๋ฌธ ์ฃผ์ ๋ด์ฉ์ ๋ณด๋ฉด, ํ์ฌ ๋ฒ์ ์ด ๋ณ๊ฒฝ๋์ด deprecated ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ๋๋ ์๋ฌ๋ก ๋ณด์ด๋๋ฐ์, ๋ง์ํด์ฃผ์ ๊ฒ์ฒ๋ผ GeocodeListener ๋ฅผ ๊ตฌํํด์ฃผ์๋ฉด ๋ฉ๋๋ค. GeocodeListener ์ธํฐํ์ด์ค๋ onGeocode ํจ์๋ฅผ ๊ตฌํํด์ฃผ๋ฉด ๋ฉ๋๋ค. Geocode๊ฐ ์ค๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ฐ, Geocode๋ฅผ ๋ฐ์ผ๋ฉด onGeocode ํจ์๋ฅผ ์คํํ๋ ๊ฒ์ด์ง์. val geocodeListener = @RequiresApi(33) object : Geocoder.GeocodeListener { override fun onGeocode(addresses: MutableList) { // ์ฃผ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ํ ๊ฒ์ ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. } }ํน์, ๋๋ค์์ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ์ ์ด์ฃผ์ด๋ ๋ฉ๋๋ค. val geocodeListener = Geocoder.GeocodeListener { addresses -> // ์ฃผ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ํ ๊ฒ์ ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. } ์ ๊ทธ๋ผ MainActivity.kt ์ updateUI ํจ์์ ์์ ๋ ์ ์ฒด ์ฝ๋๋ฅผ ๋ด๋ณผ๊น์? private fun updateUI() { locationProvider = LocationProvider(this@MainActivity) //์๋์ ๊ฒฝ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. if (latitude == 0.0 || longitude == 0.0) { latitude = locationProvider.getLocationLatitude() longitude = locationProvider.getLocationLongitude() } if (latitude != 0.0 || longitude != 0.0) { // [[[[[[[[[[[[[ ์์ ๋ ์ฝ๋ ์์]]]]]]]]]]]]]]]]] //1. ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ์ค๊ณ UI ์ ๋ฐ์ดํธ //ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ์ค๊ธฐ if (Build.VERSION.SDK_INT ) { // ์ฃผ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ํ ๊ฒ์ ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. address = addresses[0]; address?.let { binding.tvLocationTitle.text = "${it.thoroughfare}" // ์์: ์ญ์ผ 1๋ binding.tvLocationSubtitle.text = "${it.countryName} ${it.adminArea}" // ์์ : ๋ํ๋ฏผ๊ตญ ์์ธํน๋ณ์ } } override fun onError(errorMessage: String?) { address = null Toast.makeText(this@MainActivity, "์ฃผ์๊ฐ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค.", Toast.LENGTH_LONG).show() } } geocoder.getFromLocation(latitude, longitude, 7, geocodeListener) } // [[[[[[[[[[[[[ ์์ ๋ ์ฝ๋ ๋]]]]]]]]]]]]]]]]] //2. ํ์ฌ ๋ฏธ์ธ๋จผ์ง ๋๋ ๊ฐ์ ธ์ค๊ณ UI ์ ๋ฐ์ดํธ getAirQualityData(latitude, longitude) } else { Toast.makeText( this@MainActivity, "์๋, ๊ฒฝ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์์ต๋๋ค. ์๋ก๊ณ ์นจ์ ๋๋ฌ์ฃผ์ธ์.", Toast.LENGTH_LONG ).show() } } ์ ์ฝ๋์ ์์ ๋ ๋ถ๋ถ์ ๋ณด๋ฉด SDK ๊ฐ 33 ์ด์์ธ ๊ฒฝ์ฐ GeocodeListener ๋ฅผ ๋จผ์ ๊ตฌํํด์ค ํ getFromLocation ํจ์๋ฅผ ์คํํด์ค๋๋ค. 33 ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ด์ฌํ ์์ ์ ๋ค์ด์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค :) ์ถ๊ฐ์ ์ธ ์ง๋ฌธ ์์ผ์๋ฉด ๋จ๊ฒจ์ฃผ์ธ์!
- Likes
- 0
- Comments
- 2
- Viewcount
- 1.8K
Q&A
roomdatabase ์ค์นํ๋ฉด ์๋ฌ ๋ฐ์.
์๋ ํ์ธ์, ํน์ ์ ๋ต๋ณ์ผ๋ก ํด๊ฒฐ์ด ๋์ง ์์๋์?
- Likes
- 0
- Comments
- 3
- Viewcount
- 1.1K
Q&A
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์ ๊ด๋ จ ์ง๋ฌธ์์ด์
์๋ ํ์ธ์, comst19๋!์ฑ์ ์ง์ ๋ค๊ฐ ๊น์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ๊ณ์๋๊ตฐ์!๋ฃธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฏ๋ก ์ฌ์ค ์ธ๋ถ ์ ์ฅ์์ ๊ธฐ๋ฅ์ ํ๊ธฐ์๋ ์ด๋ ค์ด ๋ฉด์ด ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ํ์ผ์ ํตํด ์ธ๋ถ ์ ์ฅ์์ ์ฎ๊ธฐ๊ณ ๋ค์ด๋ก๋๋ฅผ ํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ๋ง์ฝ comst19๋์ด ์ดํ์ ์ญ์ ํ๋ค๊ฐ ๋ค์ ์ค์นํ๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ๊ณ ์ถ๋ค๋ฉด, Firestore ์ ๊ฐ์ ์ธ๋ถ์ ์ฅ์๋ฅผ ์ฌ์ฉํด๋ณด๋ ๊ฒ์ ์ด๋จ๊น์? Firestore๋ ํ์ด์ด๋ฒ ์ด์ค์์ ๋์จ ์ ํ์ผ๋ก, ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ฅ์ ๋์์ ํด์ฃผ์ด comst19๋์ด ๋ฃธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด ๊ฐ์ ์ฝ์ด์ค๊ณ ์ฐ๊ณ ํ๋ ๊ฒ์ฒ๋ผ ์ธ๋ถ ์ ์ฅ์์ ๊ฐ์ ์ ์ฅํ๊ณ , ๋ ํ์ํ ๋ ๋ถ๋ฌ์ค๊ฒ ๋ฉ๋๋ค. ๋ฃธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ ์ฅํ๋ ๊ฒ์ด ์๋ ์ธ๋ถ์ ์ ์ฅํ๋ฏ๋ก comst1๋์ด ์๋ก์ด ํฐ์ ์ฌ์ฉํ๊ฑฐ๋, ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋๋ผ๋ ๋ฌด๋ฆฌ์์ด ์๋ํ ๊ฒ์ ๋๋ค. ํด๋น Firestore ๊ฐ์๋ 2023๋ ํ๋ฐ๊ธฐ ์ ๋ฐ์ดํธ์ ๊ฐ์๊ฐ ์ ๋ฐ์ดํธ๋ ์์ ์ ๋๋ค! ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ํน์ ๊ทธ ์ ์ ๋ฐ๋ก ํผ์ firestore ํด๋ณด์๋ค๊ฐ ์๋๋ ๋ถ๋ถ ์์ผ๋ฉด, ๊ฐ์๋ด์ฉ ๊ด๋ จ ์๋๋๋ผ๋ ์ฌ๊ธฐ์ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์๋ฉด ๋ต๋ณ ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค ๐๐ป
- Likes
- 0
- Comments
- 1
- Viewcount
- 461
Q&A
๋ทฐ์ ์์ฑ์ ๋ํ ์ง๋ฌธ์ด์์
์๋ ํ์ธ์ ์ค์นด๋ค๋!๋ง์ต๋๋ค, ์น์์๋ CSS ์์ฑ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ต๋๋ค. ๋น์ฐํ ์๋๋ก์ด๋๋ ๋ฉ๋๋ค!๊ฐ์ ์์์๋ ์ฌ๋ฌ๋ถ๋ค์ด ๋์์ธ ์์ฑ ๊ฐ์ ์ต์ํด์ง๊ณ , ์ฌ๋ฌ ๊ฐ๋ค์ ๋ฐ๋ก ๋ฃ๊ณ ๋ณ๊ฒฝํด๋ณด๋ ๊ฒ์ ์ค์ตํ์ จ์ผ๋ฉด ์ข๊ฒ ์ด์ ๊ทธ๋ ๊ฒ ๊ตฌ์ฑ์ ํ๋ต๋๋ค. ์๋๋ก์ด๋์์๋ ์ด๋ป๊ฒ ์์ฑ๊ฐ์ ์ฌํ์ฉํ ์ ์์๊น์?์ฒซ ๋ฒ์งธ๋ก๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์์ ๋ก๊ณ ์ ์ ๋ชฉ์ ๋ํ๋ด๋ 'titlebar.xml'์ ์๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ฒ๋ผ ์ฌ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ด์์์์ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. // ์ฌ๊ธฐ์ ์ฌ์ฌ์ฉํฉ๋๋ค. ... ๋ ๋ฒ์งธ๋ก๋ ์ปค์คํ ๋ทฐ๋ ์์ฑํ ์ ์์ต๋๋ค. ๋ฒํผ, ์ด๋ฏธ์ง๋ทฐ, ํ ์คํธ๋ทฐ ๋ชจ๋ ๊ฐ์์์ ๋ฐฐ์ ๋ค์ํผ "View" ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค๋ค์ ๋๋ค. ์ด๋ฐ ๋ทฐ๋ค์ ์ฐ๋ฆฌ๋ ์ง์ ๋ง๋ค ์๊ฐ ์์ต๋๋ค.ํด๋น ๋ด์ฉ์ ์ฌ๊ธฐ์ ์ค๋ช ํ๊ธฐ๋ ์ฝ๊ฐ ๊ธธ์ด์์, ์์ธํ ๋ด์ฉ์ ์๋ ์๋๋ก์ด๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ๋ฐ๋๋๋ค.https://developer.android.com/develop/ui/views/layout/custom-views/create-view ์ง๋ฌธ์ ๋ต๋ณ์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค! ๊ฐ์ฌํฉ๋๋ค :)
- Likes
- 0
- Comments
- 1
- Viewcount
- 470
Q&A
Permission Request Code ์ requestCode๊ฐ ๊ฐ์์ง if๋ฌธ์์ ํ์ธํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ์?
์๋ ํ์ธ์, atg0614๋!์ง๋ฌธํด ์ฃผ์ ๋ด์ฉ "Permission Request Code ์ requestCode๊ฐ ๊ฐ์์ง if๋ฌธ์์ ํ์ธํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ์? " ์ ๋ํ์ฌ ๋ต๋ณ๋๋ฆฌ๊ฒ ์ต๋๋ค.requestCode๋ onRequestPermissionResult, onActivityResult ์ ๊ฐ์ด ๋ค๋ฅธ ์กํฐ๋นํฐ(๋ฅผ ๋น๋กฏํ ๋ค์ํ ์ธํ ํธ)๋ฅผ ํ์ธํ๊ณ ๋ค์ ๋์์ค๋ ๊ฒฝ์ฐ์ ์ฐ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์กํฐ๋นํฐ์ ํ๋๋ง ๊ตฌํํ๊ธฐ ๋๋ฌธ์ MainActivity A ์์ Activity B ๋ก ๊ฐ๋ค๊ฐ ๋์์ค๋์ง, Activity C๋ก ๊ฐ๋ค๊ฐ ๋์์ค๋์ง ํ์ธํ๊ธฐ ์ํจ์ ์์ต๋๋ค.์๋ ์์์ฒ๋ผ requestCode๋ฅผ ์ฌ์ฉํ๋ฉด ์นด๋ฉ๋ผ๋ฅผ ๊ฐ๋ค์๋์ง, ์ ํ๋ฒํธ๋ถ์ ๊ฐ๋ค์๋์ง๋ฅผ ํ์ธํ ์๊ฐ ์์ต๋๋ค! ํผ๋ฏธ์ ์ ์ข ๋ฅ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ผ๋ ๊ฐ๊ฐ ๋ค๋ฅธ requestCode๋ฅผ ์ค๋ค๋ฉด, requestCode์ ๋ฐ๋ผ ์คํ๋ฐฉ๋ฒ์ ๋ถ๋ฆฌํ ์๋ ์๊ฒ ์ฃ ? @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_CANCELED) { // code to handle cancelled state } else if (requestCode == CAMERA_REQUEST) { // code to handle data from CAMERA_REQUEST } else if (requestCode == CONTACT_VIEW) { // code to handle data from CONTACT_VIEW } }๋ต๋ณ์ด ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๊ฒ ์ต๋๋ค. (์ถ๊ฐ๋ก ํ ์ธ ๊ธฐ๊ฐ์ ๋ชป ์ฌ์ จ๋ค๋ ๋ง์์ด ์ํ๋๋ค ใ ใ ์๊ฐํ์๊ณ code.with.joyce@gmail.com ์ผ๋ก ๋ฉ์ผ ํ๋ ์ฃผ์ธ์ ^^)
- Likes
- 0
- Comments
- 1
- Viewcount
- 469




