ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ•™์Šต

RecyclerView Itemdecoration ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

1. ๊ตฌํ˜„ ์š”๊ตฌ ์‚ฌํ•ญ ํ”„๋กœํ•„ ํ™”๋ฉด์—์„œ ์‚ฌ์šฉ์ž๋“ค์ด ๋ชจ์ž„์—์„œ ์ฐ์—ˆ๋˜ ์‚ฌ์ง„์„ GridView ํƒ€์ž…์œผ๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” UI๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด๋•Œ, ์ธ์Šคํƒ€๊ทธ๋žจ๊ณผ ๊ฐ™์ด ์‚ฌ์ง„ ์‚ฌ์ด์— ๋™์ผํ•œ Margin์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. 2. ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์‚ฌ์ง„๋“ค์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•œ RecyclerView ์ž…๋‹ˆ๋‹ค.ํ•œ ์—ด์— ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด GridLayoutManager๋ฅผ ์ด์šฉํ–ˆ์œผ๋ฉฐ, ๊ฐœ์ˆ˜๋Š” 3๊ฐœ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.  ViewHolder์—์„œ ์‚ฌ์šฉํ•œ XML ์ž…๋‹ˆ๋‹ค.RecyclerView์—์„œ ํ•œ ์—ด์˜ ์•„์ดํ…œ์„ 3๊ฐœ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, 3๊ฐœ์˜ ์•„์ดํ…œ์ด ๋ชจ๋“  width๋ฅผ ์ฐจ์ง€ํ•˜๋„๋ก Layout์˜ width๋ฅผ match_parent๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด๋ฏธ์ง€๊ฐ€ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ํ‘œ์‹œ๋˜๋„๋ก Style์„ ์ •์˜ํ•ด ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.์•„์ดํ…œ ์‚ฌ์ด์˜ ์„ธ๋กœ ๋ฐฉํ–ฅ M..

2024.07.24 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ›„๊ธฐ

๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Android 3๊ธฐ ์ž์„ธํ•œ ํ›„๊ธฐ

์ด์ „์— ์ž‘์„ฑํ•œ ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ 2์ฃผ๊ฐ€ ์ง€๋‚œ ์‹œ์ ์— ๋” ์ž์„ธํ•œ ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. https://dodobest.tistory.com/113 240629 TIL - 1์ฃผ ๋‚จ์€ ์‹œ์ ์— ์ž‘์„ฑํ•˜๋Š” ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Android 3๊ธฐ ํ›„๊ธฐTIL์„ ์•ˆ ์“ด์ง€ 2๊ฐœ์›”์ด ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ˆ˜๋ฃŒ๊นŒ์ง€ ์ผ์ฃผ์ผ ๋‚จ์€ ์‹œ์ ์— ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์  - ๊ต์œก ์‹œ๊ฐ„ ๋‚ด๋‚ด ์ƒ์ฃผํ•˜์‹œ๋Š” ๋‹ค์–‘ํ•œ ํŠœํ„ฐ ๋‹˜๋“ค ์ด ๋ถ€๋ถ„์ด ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ดdodobest.tistory.com  1. ์ฐธ์—ฌ ๊ณ„๊ธฐ 2022๋…„ ํ•˜๋ฐ˜๊ธฐ์— ๋„ค์ด๋ฒ„ ๋ถ€์ŠคํŠธ์บ ํ”„ 7๊ธฐ Andorid ๊ณผ์ •์— ์ฐธ์—ฌํ•œ ๊ฒฝํ—˜์ด ์žˆ์œผ๋‚˜, ํ•™์Šต ๋ฐฉํ–ฅ์— ์žˆ์–ด์„œ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค. ์ฝ”๋“œ๋ชฝํ‚ค๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜์ƒ์„ ๋ณด๊ณ , ํ•„์š”ํ•˜์ง€ ..

2024.07.14 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

TIL

240629 TIL - 1์ฃผ ๋‚จ์€ ์‹œ์ ์— ์ž‘์„ฑํ•˜๋Š” ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Android 3๊ธฐ ํ›„๊ธฐ

TIL์„ ์•ˆ ์“ด์ง€ 2๊ฐœ์›”์ด ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ˆ˜๋ฃŒ๊นŒ์ง€ ์ผ์ฃผ์ผ ๋‚จ์€ ์‹œ์ ์— ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์  - ๊ต์œก ์‹œ๊ฐ„ ๋‚ด๋‚ด ์ƒ์ฃผํ•˜์‹œ๋Š” ๋‹ค์–‘ํ•œ ํŠœํ„ฐ ๋‹˜๋“ค ์ด ๋ถ€๋ถ„์ด ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„์นจ 9์‹œ๋ถ€ํ„ฐ ์ €๋… 9์‹œ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ํŠœํ„ฐ ๋‹˜๋“ค์ด ์˜จ๋ผ์ธ ๊ต์œก ๊ณต๊ฐ„์— ์ƒ์ฃผํ•˜๊ณ  ๊ณ„์…”์„œ ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฒ˜์Œ ํ•™์Šตํ•˜์‹œ๋Š” ๋ถ„์ด๋ผ๋ฉด ์ด ๋ถ€๋ถ„์ด ์˜คํžˆ๋ ค ๋‹จ์ ์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠœํ„ฐ ๋‹˜์—๊ฒŒ ๊ฐ€์„œ ๋ฐ”๋กœ ์งˆ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ณด๋‹ˆ, ์†Œํ†ต ์ฑ„๋„์ธ Slack ์งˆ๋ฌธ๋ฐฉ์— ์งˆ๋ฌธ์ด ์˜ฌ๋ผ์˜ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.(๊ธฐ์ˆ˜๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ธ์ง€ํ•œ ์ง€์‹๋งŒ ์งˆ๋ฌธ์„ ํ†ตํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ง€์‹์ด ์—†๋‹ค๋ฉด ํฐ ์„ฑ์žฅ์„ ํ•˜๊ธฐ๋ž€ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.๋„ค์ด๋ฒ„ ๋ถ€์ŠคํŠธ์บ ํ”„ ์ฑŒ๋ฆฐ์ง€ ๊ณผ์ •์—์„œ ๊ณต..

2024.06.29 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ•™์Šต

์™œ repeatOnLifecycle ์•ž์— viewLifecycleOwner๋ฅผ ๋ถ™์—ฌ์•ผํ• ๊นŒ?

ํ•ต์‹ฌ ๋‚ด์šฉ ์„  ์ •๋ฆฌ์™œ repeatOnLifecycle ์•ž์— viewLifecycleOwner๋ฅผ ๋ถ™์—ฌ์•ผํ• ๊นŒ? ๊ณต์‹๋ฌธ์„œ ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ repeatOnLifecycle ์•ž์— viewLifecycleOwner๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ์ผ๊นŒ์š”?  class MyFragment : Fragment() { val viewModel: MyViewModel by viewModel() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Create a new coroutine in the lifecycleScope ..

2024.06.26 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ•™์Šต

Iterable, Iterator, Collection

์ „์ฒด์ ์ธ ๊ตฌ์กฐCollection, Iterable, Iterator์˜ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๊ฐ Interface๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.  Iterable Iterator๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋งŒ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” iterate ๋  ์ˆ˜ ์žˆ๋Š” sequence๋ฅผ ์˜๋ฏธํ•œ๋‹ค.iterate์˜ ์‚ฌ์ „์  ์˜๋ฏธ : (๊ณ„์‚ฐ·์ปดํ“จํ„ฐ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋ฅผ) ๋ฐ˜๋ณตํ•˜๋‹ค public interface Iterable { public operator fun iterator(): Iterator} operator iterator ํ•จ์ˆ˜ ์•ž์— operator ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์–ด ์žˆ๋‹ค. operator๋Š” 1 + 3 ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜(add)๋ฅผ symbol(+)๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š”..

2024.05.21 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ•™์Šต

Room์— ์ดˆ๊ธฐ ๊ฐ’์„ ๋„ฃ์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์ฒ˜์Œ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์ €์žฅ์†Œ, ์บ์‹œ๋ฅผ ์‚ญ์ œํ•œ ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ Room์— ์ดˆ๊ธฐ ๊ฐ’์„ ๋„ฃ์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์•ˆ๋‚ดํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๊ณผ ๋ฌธ์ œ์ ์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. RoomDatabase.Callback() Room DatabaseBuilder๋ฅผ ์ด์šฉํ•ด Database๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, builder์˜ addCallBack ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ RoomDatabase.Callback ํด๋ž˜์Šค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Callback ํด๋ž˜์Šค๋Š” ์ด 3๊ฐ€์ง€ ํ•จ์ˆ˜๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. onCreate : database๊ฐ€ ์ตœ์ดˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋ชจ๋“  table์ด ์ƒ์„ฑ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์ ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.onOpen : database๊ฐ€ open ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.onDestruc..

2024.05.18 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ•™์Šต

Fragment์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ ๋™์ž‘ ์ปค์Šคํ…€ํ•˜๊ธฐ

๊ณต์‹ ๋ฌธ์„œ ์˜ˆ์ œFragment์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ ๋™์ž‘์„ ์ปค์Šคํ…€ํ•˜๋ ค๋ฉด Activity์— onBackPressedDispatcher๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. class MainPageFragment : Fragment() { ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } ... } ...}https://developer.android.com/gui..

2024.05.04 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ•™์Šต

EditText์—์„œ ํ•˜๋“œ์›จ์–ด ํ‚ค๋ณด๋“œ ๋Œ€์‘ํ•˜๊ธฐ with ๊ฐ€์ƒ ํ‚ค๋ณด๋“œ, ์ปค์„œ

ํ•˜๋“œ์›จ์–ด ์—”ํ„ฐ ๋˜๋Š” ๊ฐ€์ƒ ํ‚ค๋ณด๋“œ์˜ ์™„๋ฃŒ ๋ฒ„ํŠผ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’EditorInfo๋Š” ํ‚ค ์ž…๋ ฅ์„ ์™„๋ฃŒํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. EditText์˜ imeOptions attribute์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์•„๋ฌด ๊ฒƒ๋„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๊ฐ’์ธ actionDone(S23/Android14) ๋˜๋Š” actionNext(S9/Android10)๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ : EditorInfo.IME_ACTION_DONE, EditorInfo.IME_ACTION_SEARCH,  EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_NEXT    actionDone์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. actionSearch๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.  actionSend๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.   ์—”ํ„ฐ..

2024.05.02 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

ํ•™์Šต

FrameLayout์—์„œ Fragment ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

FrameLayout์—์„œ Fragment๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต์‹ ๋ฌธ์„œ์—์„œ Fragment๋ฅผ ์œ„ํ•œ container๋กœ FragmentContainerView ์‚ฌ์šฉ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.It is strongly recommended to always use a FragmentContainerView as the container for fragments, as FragmentContainerView includes fixes specific to fragments that other view groups such as FrameLayout do not provide.https://developer.android.com/guide/fragments/create#add ๊ทธ๋Ÿผ์—๋„ FrameLayout์—์„œ..

2024.05.02 ๊ฒŒ์‹œ๋จ

ํฌ์ŠคํŒ… ์ธ๋„ค์ผ ์ด๋ฏธ์ง€

TIL

240426 TIL - ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ ์ˆ™๋ จ์ฃผ์ฐจ ํŒ€ํ”„๋กœ์ ํŠธ ์™„๋ฃŒ

https://github.com/AndroidJeong/NBC_TwoOfUs GitHub - AndroidJeong/NBC_TwoOfUsContribute to AndroidJeong/NBC_TwoOfUs development by creating an account on GitHub.github.com ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ ์ˆ™๋ จ์ฃผ์ฐจ ํŒ€ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์‹ฌํ™” ์ฃผ์ฐจ(๊ฐœ์ธ ํ•™์Šต 2์ฃผ + ํŒ€ํ”„๋กœ์ ํŠธ 2์ฃผ), ์‹ค์ „ ํ”„๋กœ์ ํŠธ(6์ฃผ)๊ฐ€ ๋‚จ์•˜๋Š”๋ฐ, ์ด๋ฒˆ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋Š๋‚€์ ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. 1. ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์ž์ปค๋ฆฌํ˜๋Ÿผ ์ƒ์—์„œ Repository๋ฅผ ๋ฐฐ์šฐ์ง€ ์•Š์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ์— ์–ด์ฉ” ์ˆ˜ ์—†์ด Object class๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ์ถ”์ ํ•˜..

2024.04.27 ๊ฒŒ์‹œ๋จ