λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Android][View] λ·°κ°€ layout을 μ§„ν–‰ν•˜λŠ” 쀑에 requestLayout()을 ν˜ΈμΆœν•˜λ©΄ μ•ˆλœλ‹€.

https://www.youtube.com/watch?v=HbAeTGoKG6k 

무렀 13λ…„ μ „μ˜ μ˜μƒ. κ·ΈλŸ¬λ‚˜ μ§€κΈˆλ„ μ€‘μš”ν•œ κΈ°λ³Έ μ§€μ‹μœΌλ‘œ μ•Œμ•„λ‘˜ ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν–ˆλ‹€.

 

μš”μ•½ 

μ§„ν–‰ν•œ 데λͺ¨ (μ΄λ ‡κ²Œ ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€. λ‚˜μœ μ˜ˆμ‹œ)

1. LinearLayout 을 μƒμ†ν•œ Custom Layout이 layout 과정을 μ§„ν–‰ν•˜λŠ” 쀑에, κ·ΈλŸ¬λ‹ˆκΉŒ onLayout()을 ν˜ΈμΆœν•΄ μ‹€ν–‰ν•˜λŠ” 쀑에

2. μžλ…€ λ·°λ₯Ό add ν•˜κ±°λ‚˜(addView()) remove ν•˜λ©΄(removeView())

3. κ²°λ‘  : μ΄μŠˆκ°€ 생긴닀. > μΌμ’…μ˜ μž¬κ·€λ¬Έμ œκ°€ 생긴닀.

 

layout 쀑 : 일뢀 ν•˜μœ„ 집합(μžλ…€ λ·°λ“€)μ΄λ‚˜ 전체 λ·° 계측 ꡬ쑰λ₯Ό μž¬λ°°μΉ˜ν•˜λŠ” 쀑인데

이 타이밍에 addView(), removeView() 호좜 : λ ˆμ΄μ•„μ›ƒ 전체에 영ν–₯을 μ£ΌλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄λ²„λ¦¬λ‹ˆ >> 또 layout을 μ‹€ν–‰ν•˜κ²Œ λ˜λŠ” κ²ƒμž„

> 일을 ν•˜λŠ” 쀑에 속성을 λ³€κ²½μ‹œμΌœ λ²„λ €μ„œ λΆ€μž‘μš©μ΄ μƒκΈ°λŠ” 것. 

 

그럼 μ—¬κΈ°μ„œ λ§ν•˜λŠ” layout 은 무엇을 ν•˜λŠ” 과정인가

https://developer.android.com/reference/android/view/View#layout
 

View  |  Android Developers

 

developer.android.com

이건 μ•ˆλ“œλ‘œμ΄λ“œ λ””λ²¨λ‘œνΌμŠ€ κ³΅μ‹λ¬Έμ„œ λ‚΄μš©.

과거에 μ•„μ˜ˆ 이 View μͺ½ μ„€λͺ…을 μž‘μ •ν•˜κ³  λ²ˆμ—­ν•œ 적이 μžˆλ‹€.

λ‚˜μ˜ λ°œλ²ˆμ—­ View 곡식 λ¬Έμ„œ λ‚΄μš©μ€ μ—¬κΈ°μ„œ 보면 λœλ‹€.

λ‚˜μ˜ λ°œλ²ˆμ—­. κ·Έλž˜λ„ λ‚΄μš© νŒŒμ•…μ€ κ°€λŠ₯ν•΄μ„œ 닀행이닀.

 

μ˜μƒμ—μ„œ λ§ν•˜λŠ” layout μž‘μ—…μ€, λΆ€λͺ¨ λ·°κ°€ μžλ…€ 뷰의 크기 정보λ₯Ό 가지고 μžλ…€ 뷰듀을 λ°°μΉ˜ν•˜λŠ” 과정이겠닀. λΆ€λͺ¨ λ·°κ°€ μžλ…€ λ·°λ₯Ό λ°°μΉ˜ν•˜λŠ” 과정이 진행 쀑인데 μžλ…€ λ·°κ°€ μƒˆλ‘œ μΆ”κ°€ λ˜κ±°λ‚˜ κΈ°μ‘΄ μžλ…€λ·°κ°€ μ‚¬λΌμ Έμ„œ

> λΆ€λͺ¨ λ·°λŠ” 과거의 정보λ₯Ό 가지고 μž‘μ—…μ„ ν•˜λ‹ˆ μ΄μŠˆκ°€ λ°œμƒν•  수 있겠고

> μžλ…€ λ·°κ°€μ˜ μΆ”κ°€ λ˜λŠ” 제거둜 인해 λΆ€λͺ¨ λ·°κ°€ layout 과정을 μ§„ν–‰ν•˜λ €κ³  ν•  텐데, 이게 layout 쀑에 μΌμ–΄λ‚˜κ² μœΌλ‹ˆ. μ™œ μΌμ’…μ˜ μž¬κ·€λ¬Έμ œκ°€ μƒκΈ΄λ‹€λŠ”μ§€ 감이 μ˜¨λ‹€. 

 

λ‚˜μœ μ˜ˆμ‹œ 고치기

1. λ‹€λ₯Έ μž‘μ—… 없이 κ·Έλƒ₯ λ°”λ‘œ μžλ…€ λ·°λ₯Ό add ν•˜κ±°λ‚˜ remove ν•˜κΈ°

> κ°œλ°œμžκ°€ λ ˆμ΄μ•„μ›ƒ μ§„ν–‰ν•˜λΌκ³  μ‹œν‚¬ ν•„μš”κ°€ μ—†λ‹€.

 

 μ˜μƒ λ’·λΆ€λΆ„μ—μ„œ μ € κ°œλ°œμžλΆ„μ΄ μ•„μ£Ό μ‹ μ‹ λ‹ΉλΆ€ ν•˜μ‹ λ‹€. 

 

μ˜μƒμ˜ 6:54 μͺ½ 슀크립트

But the most important thing to remember is, when you finish layout, all of the measurement and layout information for that container should be done. It should be complete. Which means, if you're adding children during the middle of layout, you need to make sure that your measurement information and that of your children is all correct by the time you return from layout.
Because that's what the rest of the view hierarchy expects.

λ°œλ²ˆμ—­

κΈ°μ–΅ν•΄μ•Όν•  κ°€μž₯ μ€‘μš”ν•œ 것은, λ ˆμ΄μ•„μ›ƒμ΄ 끝났을 λ•Œ, κ·Έ μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•œ λͺ¨λ“  μΈ‘μ •κ³Ό λ ˆμ΄μ•„μ›ƒ μ •λ³΄λŠ” λλ‚˜μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. μ™„λ£Œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 즉, λ§Œμ•½ λ ˆμ΄μ•„μ›ƒ 도쀑에 μžλ…€ 뷰듀을 μΆ”κ°€ν•œλ‹€λ©΄, λ‹Ήμ‹ μ˜ μΈ‘μ • 정보와 μžμ‹ λ·°λ“€μ˜ μΈ‘μ • 정보가 λ ˆμ΄μ•„μ›ƒμœΌλ‘œλΆ€ν„° λ°˜ν™˜λ°›μ€ μ‹œμ κΉŒμ§€ λͺ¨λ“  것이 μ •ν™•ν•˜λ‹€λŠ” 것을 ν™•μ‹€νžˆ ν•΄μ•Όν•©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λ·° κ³„μΈ΅μ˜ λ‚˜λ¨Έμ§€ 뢀뢄듀이 κΈ°λŒ€ν•˜λŠ” λ°”κ°€ κ·Έλ ‡κ±°λ“ μš”.

 

μ˜μƒμ˜ 7:23 슀크립트

And make sure that when your layout for your container finishes, everything below it is handled correctly so that the view hierarchy is in a consistent state with your container.

λ°œλ²ˆμ—­

μ»¨ν…Œμ΄λ„ˆμ˜ λ ˆμ΄μ•„μ›ƒμ΄ 끝났을 λ•Œ, μ»¨ν…Œμ΄λ„ˆ μ•„λž˜μ˜ λͺ¨λ“  것듀이 μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬λ˜μ–΄ λ·° 계측이 μ»¨ν…Œμ΄λ„ˆμ˜ μƒνƒœμ™€ μΌμΉ˜ν•œμ§€ ν™•μ‹€νžˆ ν™•μΈν•˜μ„Έμš”.

 

λ„΅πŸ™†‍♀️