[Android TIL] 240319
๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

~ Today I Learned ~

 

โœ”๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด (์ œ์ผ ์ž‘์€ ์ˆ˜ ๋”ํ•˜๊ธฐ, ๊ฐ€์šด๋ฐ ๊ธ€์ž ๊ฐ€์ ธ์˜ค๊ธฐ)
โœ”๏ธ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ๊ฐœ๋ฐœ ์ž…๋ฌธ ๊ฐ•์˜ 3์ฃผ์ฐจ ์ˆ˜๊ฐ• ๋ฐ ์ •๋ฆฌ
โœ”๏ธ ๊ฐœ์ธ ๊ณผ์ œ ์‹œ์ž‘

X๊ณ„ํš์‹คํŒจX ํ‚ค์˜ค์Šคํฌ ๊ณผ์ œ ๋ณต์Šต ๋ฐ ํ•ด์„ค

 

<๊ฒฐ๊ณผ๋ฌผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ>

 

 


 

 

1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด 2๋ฌธ์ œ

 

 

[Kotlin] ์ œ์ผ ์ž‘์€ ์ˆ˜ ๋”ํ•˜๊ธฐ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๋ฌธ์ œ https://school.programmers.co.kr/learn/courses/30/lessons/12935 ์ ‘๊ทผ 1. arr์—์„œ ์ œ์ผ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ๊ณ  (null์ผ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ .min() ๋ณด๋‹ค๋Š” .minOrNull() ์‚ฌ์šฉ) arr์—์„œ ์ œ๊ฑฐ 2. arr๊ฐ€ ๋น„์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ arr ๋ฆฌํ„ด, arr๊ฐ€ ๋น„

limheejin.tistory.com

 

[Kotlin] ๊ฐ€์šด๋ฐ ๊ธ€์ž ๊ฐ€์ ธ์˜ค๊ธฐ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๋ฌธ์ œ https://school.programmers.co.kr/learn/courses/30/lessons/12903 ์ ‘๊ทผ s์˜ ๊ธธ์ด ๋‚˜๋ˆ„๊ธฐ 2๋ฅผ ๋‚ด๋ฆผํ•˜์—ฌ ๋ณ€์ˆ˜ x๋กœ ์ง€์ •ํ•˜๊ณ , ์ง์ˆ˜์ธ ๊ฒฝ์šฐ s[x-1], s[x] ์ถœ๋ ฅ / ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ s[x] ์ถœ๋ ฅ ์œ„์˜ ๋ฐฉ๋ฒ•์„ ๊ตฌ์ƒํ•˜๊ณ  ์•„๋ž˜์˜ ์ฝ”

limheejin.tistory.com

  • minOrNull(), filter(), substring(), slice(), with() ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€์ดํ•˜์˜€๋‹ค.

 

๐Ÿ’ก substring()

  • ๋ฌธ์ž์—ด์—์„œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
  • substring(startIndex: Int): ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์˜ ๋๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
  • substring(startIndex: Int, endIndex: Int): ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ข…๋ฃŒ ์ธ๋ฑ์Šค ์ „๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
    ์ฐธ๊ณ ๋กœ ์‹œ์ž‘ ์ธ๋ฑ์Šค๋Š” ํฌํ•จ๋˜์ง€๋งŒ, ์ข…๋ฃŒ ์ธ๋ฑ์Šค๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. (๋ฏธ๋งŒ)
  • ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค๋Š” 0

 

 

 

 

2. ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ๊ฐœ๋ฐœ ์ž…๋ฌธ ๊ฐ•์˜ 3์ฃผ์ฐจ ์ˆ˜๊ฐ• ๋ฐ ์ •๋ฆฌ

 

 

[Android ๊ธฐ์ดˆ] 4. UI ๊ธฐ๋ณธ ๊ฐœ๋… (UI, Widget, Button)

UI๋Š” ๊ฐœ๋ฐœ์˜ 50%๋ฅผ ์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ •๋„๋กœ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ 1. ์•ˆ๋“œ๋กœ์ด๋“œUI ๊ธฐ๋ณธ ๊ฐœ๋… ๋ฐ ์„ค๊ณ„ ๋ฐฉ๋ฒ• ๋ทฐ(View) ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์˜ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„ = ์œ„์ ฏ + ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ 1. ์œ„์ ฏ(Widget) - View์˜ ์„œ๋ธŒ

limheejin.tistory.com

 

[Android ๊ธฐ์ดˆ] 5. UI ๊ธฐ๋ณธ ๊ฐœ๋… (Layout, Margin, Padding, Gravity, Style, Theme)

1. ๋ ˆ์ด์•„์›ƒ(Layout) ๋ ˆ์ด์•„์›ƒ์ด๋ž€ ViewGroup์˜ ํŒŒ์ƒ ํด๋ž˜์Šค๋กœ์„œ, ํฌํ•จ๋œ View๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ธฐ๋Šฅ 01. Linear Layout ์ปจํ…Œ์ด๋„ˆ์— ํฌํ•จ ๋œ ์ž์‹ ๋ทฐ๋“ค์„ ์ˆ˜ํ‰ ๋˜๋Š” ์ˆ˜์ง์œผ๋กœ ์ผ๋ ฌ ๋ฐฐ์น˜ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜

limheejin.tistory.com

  • View
  • Widget
  • ๋””์Šคํ”Œ๋ ˆ์ด ๋‹จ์œ„(px, dp, dpi, in, mm, sp) ์™€ ๋‹ค์–‘ํ•œ ํ•ด์ƒ๋„์˜ ๋Œ€์‘(LDPI, MDPI, HDPI...)
  • TextView, EditText, Button, ImageView
  • Layout (Linear, Relative, Table, Frame, Constraint)
  • Margin, Padding, Gravity
  • Style, Theme

์œ„์™€ ๊ฐ™์€ ๋‚ด์šฉ์— ๋Œ€ํ•˜์—ฌ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜๊ณ  ์ •๋ฆฌํ•˜์˜€๋‹ค. 
๋˜ํ•œ, LinearLayout, RelativeLayout, CosntraintLayout์„ ์ด์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹ค์Šต์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

 

์›๋ž˜๋Š” 4์ฃผ์ฐจ๊นŒ์ง€ ๋ชจ๋‘ ์™„๊ฐ•ํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ๊ณผ์ œ์™€ ๋ณ‘ํ–‰ํ•˜๋‹ค๋ณด๋‹ˆ ๋‚ด์ผ 4์ฃผ์ฐจ๋ฅผ ์™„๊ฐ•ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

 

3. ๊ฐœ์ธ ๊ณผ์ œ ๊ตฌํ˜„ (ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€)

 

  • ์ œ์ž‘์ค‘์ด๋‹ค. ์ฃ„๋‹ค ํ•˜๋“œ์ฝ”๋“œ๋กœ ๊ตฌํ˜„์ค‘์ด๋ผ ๋‚˜์ค‘์— ๋ฆฌํŒฉํ† ๋ง ์—„์ฒญ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 


 

~ Trouble Shooting ~

 

 

1. ๋ฒ„ํŠผ ์ƒ‰์ƒ์šฉ xml์ด ๋ ˆ์ด์•„์›ƒ ์ƒ์—์„œ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

  • ๋ฒ„ํŠผ์— ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์ž…ํžˆ๊ธฐ ์œ„ํ•ด button_background.xml์„ ๋งŒ๋“ค๊ณ ,
    ๋ ˆ์ด์•„์›ƒ xml์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ–ˆ๋Š”๋ฐ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค.
<Button
        ...
        android:background="@drawable/button_background"
        ... />
  • ํŒ€์›๋ถ„์ด ์นœ์ ˆํ•˜๊ฒŒ ์•Œ๋ ค์ฃผ์…”์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๋งํฌ : Stackoverflow - Android Button background color not changing
  • ๊ธฐ์กด์˜ Button ์„ ์–ธ ํ˜•ํƒœ๋Š” ๋””ํดํŠธ ์ƒ‰์ƒ์„ ์ด๊ธธ ์ˆ˜๊ฐ€ ์—†๊ณ ,
      <androidx.appcompat.widget.AppCompatButton
        </androidx.appcompat.widget.AppCompatButton>์˜ ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์•ผ ๋””ํดํŠธ ์ƒ‰์ƒ์„ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • 'android button background not working' ํ‚ค์›Œ๋“œ๋กœ ๊ตฌ๊ธ€๋งํ•˜์…จ๋‹ค๋Š”๋ฐ, ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ฉด์„œ๋Š” ๋ฌด์กฐ๊ฑด ์˜์–ด๋กœ ์„œ์นญํ•˜๊ณ , ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์ฐพ์•„๋ณด๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€์ž.

 

 

 

2. ๋นŒ๋“œ ์˜ค๋ฅ˜

  • Unable to match the desired swap behavior. ์˜ค๋ฅ˜๊ฐ€ ๋–ด๋‹ค.
  • ์›๋ž˜ ๊ตฌ๋™์ด ์ž˜ ๋˜๋‹ค๊ฐ€, ๋ฉ”์ธ ๋ ˆ์ด์•„์›ƒ xml์—์„œ constraint ๋ฐฐ์น˜ ์—ฐ๊ฒฐ์„ ๋งŽ์ด ํ•˜๊ณ ๋‚˜์„œ๋ถ€ํ„ฐ ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋‹ค.
  • Clear, Rebuild, ์บ์‹œ ์‚ญ์ œ๊นŒ์ง€ ๋ชจ๋‘ ์ง„ํ–‰ํ•˜๊ณ  ๋‹ค์‹œ ๋นŒ๋“œํ•ด๋„ ์•ˆ ๋œ๋‹ค.
Skipped 84 frames!  The application may be doing too much work on its main thread.
  • ์šฉ๋Ÿ‰ ๋ฌธ์ œ๋กœ model๊ณผ view๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ค๋Š” viewModel, ๋ฉ”๋ชจ๋ฆฌ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž˜ ์งœ์•ผ ํ•ด๊ฒฐ๋˜๋Š” ๋ฌธ์ œ์ธ๋“ฏ ํ•œ๋ฐ ๊ต‰์žฅํžˆ ๋‹จ์ˆœํ•œ xmlํŒŒ์ผ ํ•˜๋‚˜ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ๋„ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒจ์„œ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.
  • ์ผ๋‹จ ์—ฌ๋Ÿฌ๋ฒˆ ๊ป๋‹ค ์ผœ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”๋ฐ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œํ•ด๊ฒฐ์€ ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ๋‚˜์ค‘์— ๋‹ค์‹œ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.

 

 

 


~ Retrospect ~

 

 

์ž‘๋…„ ํ•œํ•ด๋™์•ˆ์€ 1๋…„ ํ”Œ๋žœ์„ ์งœ์„œ ํ•™์‚ฌ/๊ธฐ์‚ฌ/์ทจ์—…๊นŒ์ง€ ๋ชจ๋‘ ๋ฌผํ๋ฅด๋“ฏ์ด ๋์—ˆ๋˜ ๊ฑฐ ๊ฐ™์€๋ฐ, ์ด๋ฒˆ๋…„๋„๋Š” 3์›”์ด ๋  ๋•Œ๊นŒ์ง€ ๋ณ„๋‹ค๋ฅธ ๊ตฌ์ฒด์ ์ธ ์ง€ํ‘œ๋ฅผ ์„ธ์šฐ์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ ์ฃผ ์•ˆ์— ์˜ฌํ•ด 12์›”๊นŒ์ง€์˜ ์ƒ์„ธ์ ์ธ ๊ฐœ๋ณ„ ๋ชฉํ‘œ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์„ฑ๊ณผ ์ง€ํ‘œ๋ฅผ ์„ธ์›Œ์•ผ๊ฒ ๋‹ค. ์ •๋ง ๋งค์ถœ์— ๋Œ€ํ•œ ์š•์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋งค์ถœ์— ๋Œ€ํ•œ ๋‹จ๊ธฐ 3๋…„ ๋ชฉํ‘œ๋„ ์„ธ์›Œ์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๋งค์ผ ํ๋ฅด๋Š” ์‹œ๊ฐ„๋“ค์„ ์–ด๋–ป๊ฒŒ ๋ถ™์žก์•„๋‘˜์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž.

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T