๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค2024 ์•ˆ๋“œ๋กœ์ด๋“œ/๐Ÿฟ ์˜ํ™” ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์ผ์ง€

Android ๋ ˆ์ด์•„์›ƒ ๊ณต์‹๋ฌธ์„œ ์ •๋ฆฌ

by hyeonha 2024. 3. 27.

๋ชฉ์ฐจ

    ์•ˆ๋“œ๋กœ์ด๋“œ UI ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด ConstraintLayout, LinearLayout , ๋ ˆ์ด์•„์›ƒ์„ ์งœ๋ณด์ž~~ํ•˜๊ณ  ๋ง์„ ํ•˜๊ณค ํ•œ๋‹ค.

    ๊ทธ๋Ÿฌ๋˜ ์ค‘ ๋ ˆ์ด์•„์›ƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ฌป๋Š”๋‹ค๋ฉด ๋ญ๋ผ๊ณ  ๋Œ€๋‹ตํ• ๊นŒ? ํ•˜๋Š” ์งˆ๋ฌธ์ด ๋จธ๋ฆฟ์†์— ๋– ์˜ฌ๋ž๊ณ  ๋ ˆ์ด์•„์›ƒ์„ ํ•ญ์ƒ ์ ‘ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ฐœ๋…์„ ๋ง๋กœ์จ ์„ค๋ช…ํ•˜๊ธฐ์—๋Š” ๊ฐœ๋…์ด ์ œ๋Œ€๋กœ ์ •๋ฆฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๊ณ  ๋Š๊ผˆ๋‹ค.

     

    ๊ทธ ๋ž˜ ์„œ ์˜ค๋Š˜์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต์‹๋ฌธ์„œ ๋ทฐ ํŒŒํŠธ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค!!!

     

    ๋ ˆ์ด์•„์›ƒ์ด๋ž€?

    ๊ทธ๋ž˜์„œ ๋ ˆ์ด์•„์›ƒ์ด ๋ญ์•ผ?

    ๋ ˆ์ด์•„์›ƒ์€ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ์™€ ๊ฐ™์ด ์•ฑ ๋‚ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ๋‹ค.๋ ˆ์ด์•„์›ƒ์˜ ๋ชจ๋“  ์š”์†Œ๋Š” View ๋ฐ ViewGroup ๊ฐ์ฒด์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด ๋•Œ ๋ทฐ์™€ ๋ทฐ ๊ทธ๋ฃน์˜ ์ฐจ์ด๊ฐ€ ๋ฌด์—‡์ผ๊นŒ??

     

    โ“ ๋ทฐ์™€ ๋ทฐ ๊ทธ๋ฃน์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

    ๐Ÿค View ๊ฐ์ฒด๋Š” ์œ„์ ฏ์ด๋ผ๊ณ  ํ•˜๋ฉฐ Button ๋˜๋Š” TextView์™€ ๊ฐ™์€ ์„œ๋ธŒ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ๋‹ค.

    ViewGroup ๊ฐ์ฒด๋Š” ๋ ˆ์ด์•„์›ƒ์ด๋ผ๊ณ  ํ•˜๋ฉฐ ConstraintLayout์ด๋‚˜ LinearLayout ์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ๋‹ค.

     

    ๋ ˆ์ด์•„์›ƒ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•

    1๏ธโƒฃUI ์š”์†Œ๋ฅผ XML๋กœ ์„ ์–ธํ•œ๋‹ค. 

       xml๋กœ UI๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ์ฝ”๋“œ์™€ ์•ฑ์„ ํ‘œํ˜„ํ•˜๋Š” UI ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ XMLํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์™€ ๋ฐฉํ–ฅ์— ๋‹ค์–‘ํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๋” ์‰ฝ๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

    2๏ธโƒฃ๋Ÿฐํƒ€์ž„์— ๋ ˆ์ด์•„์›ƒ ์š”์†Œ๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•œ๋‹ค. 

        ์ด ๋ฐฉ์‹์€ View์™€ ViewGroup ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ์†์„ฑ์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

     

    โ“ ๋Ÿฐํƒ€์ž„๊ณผ ์ปดํŒŒ์ผ์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ?

    ๋Ÿฐํƒ€์ž„ ๋–„ ์ธ์Šคํ„ด์Šคํ™” ํ•œ๋‹ค. ๋ ˆ์ด์•„์›ƒ์„ XML๋กœ ์„ ์–ธํ•œ ํ›„ ์ปดํŒŒ์ผ๋˜๋„๋ก ... ์—์„œ ๋‚˜์˜ค๋Š” ๋Ÿฐํƒ€์ž„๊ณผ ์ปดํŒŒ์ผ์ด ์ •ํ™•ํžˆ ์–ด๋–ค ๊ณผ์ •์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

    ๐Ÿค

    ๋จผ์ € ์ปดํŒŒ์ผ์€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ฌธ๋ฒ•์  ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค!. ์ด ๊ณผ์ •์€ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ง„ํ–‰๋˜๋Š” ๊ณผ์ •์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋Š” .ktํŒŒ์ผ์„ .classํŒŒ์ผ(๋ฐ”์ดํŠธ์ฝ”๋“œ)๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

     

    ๋Ÿฐํƒ€์ž„์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ์˜ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ์— ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์„ ๋งํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋Ÿฐํƒ€์ž„ ๋•Œ ์ธ์Šคํ„ด์Šคํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค!! 

     

    ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์ค€ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ๋“ค์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— View ๋ฆฌ์†Œ์Šค ์•ˆ์— ์ปดํŒŒ์ผ๋œ๋‹ค. ์•กํ‹ฐ๋น„ํ‹ฐ์˜ onCreate ์ฝœ๋ฐฑ ๊ตฌํ˜„์—์„œ ๋ ˆ์ด์•„์›ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ๋ดค์„ ํ˜•ํƒœ์ธ ์•„๋ž˜์˜ ํ˜•ํƒœ์ฒ˜๋Ÿผ xml ๋ ˆ์ด์•„์›ƒ์„ setContentView๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค. 

    fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_layout)
    }

     

    ์†์„ฑ

    ๋ชจ๋“  View์™€ ViewGroup ๊ฐ์ฒด๋Š” ๊ณ ์œ ํ•œ ๋‹ค์–‘ํ•œ xml ์†์„ฑ์„ ์ง€์›ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด TextView ์†์„ฑ์€ textSize๋ผ๋Š” ์†์„ฑ์„ ์ง€์›ํ•œ๋‹ค. ์ด ์†์„ฑ์€ TextView์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ TextView ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ชจ๋“  View ๊ฐ์ฒด์—์„œ๋„ ์ƒ์†๋œ๋‹ค. 

    id ์†์„ฑ์€ ๋ฃจํŠธ View ํด๋ž˜์Šค์—์„œ ์ƒ์†๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  View ๊ฐ์ฒด์— ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉ๋œ๋‹ค.

    ๋ ˆ์ด์•„์›ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์—ฌ๊ฒจ์ง€๋Š” ์†์„ฑ๋„ ์žˆ๋‹ค. ์ด ์†์„ฑ์€ View ๊ฐ์ฒด์˜ ์ƒ์œ„ ViewGroup ๊ฐ์ฒด์—์„œ ์ •์˜ํ•œ๋Œ€๋กœ  ๋ ˆ์ด์•„์›ƒ orientation,  ํŠน์ • ๋ ˆ์ด์•„์›ƒ ๋ฐฉํ–ฅ์„ ์„ค๋ช…ํ•ด์ฃผ๋Š” ์†์„ฑ์ด๋‹ค.

     

    ID ์†์„ฑ

    ๋ชจ๋“  view ๊ฐ์ฒด์—๋Š” ํŠธ๋ฆฌ ๋‚ด์—์„œ View๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ๋œ ์ •์ˆ˜์ธ ID๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ID๋Š” ์•ฑ์ด ์ปดํŒŒ์ผ๋  ๋•Œ (์ฆ‰ kt -> ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ ๊ณผ์ •) ์ •์ˆ˜๋กœ ์ฐธ์กฐ๋˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ xml ํŒŒ์ผ์—์„œ id ์†์„ฑ์˜ ๋ฌธ์ž์—ด๋กœ ํ• ๋‹น๋œ๋‹ค. 

     

    ID๋Š” ํŠธ๋ฆฌ ์ „์ฒด์—์„œ๋Š” ๊ณ ์œ ํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ๊ฒ€์ƒ‰ํ•˜๋Š” ํŠธ๋ฆฌ์˜ ๋ถ€๋ถ„ ๋‚ด์—์„œ๋Š” ๊ณ ์œ ํ•ด์•ผํ•œ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ๊ณ ์œ ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค!

     

    ๋ ˆ์ด์•„์›ƒ ๋งค๊ฐœ๋ณ€์ˆ˜

    ์ด๋Š” layout_somthing ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๋ ˆ์ด์•„์›ƒ ์†์„ฑ์ด๋‹ค.

    ์ด ์†์„ฑ์€ ์†์„ฑ์ด ์žˆ๋Š” ViewGroup์— ์ ์ ˆํ•œ View์˜ ๋ ˆ์ด์•„์›ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. 

    ๋ชจ๋“  ViewGroup ํด๋ž˜์Šค๊ฐ€ ViewGroup.LayoutParams๋ฅผ ํ™•์žฅํ•˜๋Š” ์ค‘์ฒฉ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด ์„œ๋ธŒ ํด๋ž˜์Šค์—๋Š” ๊ฐ ํ•˜์œ„ ๋ทฐ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๋ทฐ ๊ทธ๋ฃน์— ์ ์ ˆํ•˜๊ฒŒ ์ •์˜ํ•˜๋Š” ์†์„ฑ ์œ ํ˜•๋“ค์ด ํฌํ•จ๋œ๋‹ค. 

     

    ๋ชจ๋“  ๋ทฐ ๊ทธ๋ฃน์—๋Š” layout_width์™€ layout_height๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์ •์˜ํ•ด์ค€๋‹ค. 

    ๋„ˆ๋น„์™€ ๋†’์ด๋Š” ์ •ํ™•ํ•œ ์น˜์ˆ˜๋กœ ์ž์ฃผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค! 

     

    - wrap_content : ์ฝ˜ํ…์ธ ์— ํ•„์š”ํ•œ ํฌ๊ธฐ๋กœ ์ž์ฒด ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๋„๋ก ๋ทฐ์— ์ง€์‹œํ•œ๋‹ค.

    - match_parent : ์ƒ์œ„ ๋ทฐ ๊ทธ๋ฃน์ด ํ—ˆ์šฉํ•˜๋Š” ํ•œ ์ตœ๋Œ€ํ•œ์œผ๋กœ ์ปค์ง€๋„๋ก ๋ทฐ์— ์ง€์‹œํ•œ๋‹ค.

     

    ๋ ˆ์ด์•„์›ƒ์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋Š” ํ”ฝ์…€๊ณผ ๊ฐ™์€ ์ ˆ๋Œ€์ ์ธ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!

    ๊ทธ๋ณด๋‹ค๋Š” ๋ฐ€๋„ ํ”ฝ์…€ ๋‹จ์œ„์ธ dp, ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์•Œ์•„๋ณธ wrap_content, match_parent์™€ ๊ฐ™์€ ์ƒ๋Œ€์ ์ธ ์ธก์ •๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

     

    ์ผ๋ฐ˜ ๋ ˆ์ด์•„์›ƒ

    ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ ๋‚ด์— ์ค‘์ฒฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ ˆ์ด์•„์›ƒ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€๋Šฅํ•œ ์–•๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค!

    ์ค‘์ฒฉ๋œ ๋ ˆ์ด์•„์›ƒ์ด ์ ์„์ˆ˜๋ก ๋” ๋น ๋ฅด๊ฒŒ ๊ทธ๋ ค์ง„๋‹ค. ๋„“์€ ๋ทฐ ๊ณ„์ธต๊ตฌ์กฐ๊ฐ€ ๊นŠ์€ ๋ทฐ ๊ณ„์ธต๊ตฌ์กฐ๋ณด๋‹ค ๋‚ซ๋‹ค!

     

        ์ง€๊ธˆ ๊ตฌํ˜„ํ•˜๊ณ ์žˆ๋Š” ๋ฉ”์ธํ™”๋ฉด ui ๊ตฌ์กฐ ๊ตฌํ˜„ ์‹œ ์ž˜ ๊ธฐ์–ตํ•˜๊ณ  ๊ตฌํ˜„ํ•ด๋ด์•ผ๊ฒ ๋‹ค 

     

    + ์ฐพ์•„๋ณด๋‹ˆ ๊ทธ๋ž˜์„œ ConstarintLayout์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. 
    ConstriantLayout์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์ฒฉ๋œ ๋ทฐ ๊ทธ๋ฃน์ด ์—†๋Š” ํ”Œ๋žซ ๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ํฌ๊ณ  ๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

     

    LinearLayout์€ ๋ชจ๋“  ํ•˜์œ„ ์š”์†Œ๋ฅผ ๊ฐ€๋กœ ๋˜๋Š” ์„ธ๋กœ๋กœ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ทฐ ๊ทธ๋ฃน์ด๋‹ค. 

    ๊ทธ๋ ‡์ง€๋งŒ ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” ConstraintLayout์œผ๋กœ ๋นŒ๋“œ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค! 

     

    + LinearLayout์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ Component Tree์—์„œ Convert LinearLayout to ConstraintLayout์„ ํ†ตํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

    ๋™์  ๋ชฉ๋ก ์ž‘์„ฑ

    ๋ ˆ์ด์•„์›ƒ ์ฝ˜ํ…์ธ ๊ฐ€ ๋™์ ์ด๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ RecyclerView ๋˜๋Š” AdapterView์˜ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” RecyclerView๊ฐ€ AdapterView๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

     

    ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ด์•„์›ƒ์€ 1) ์Šคํฌ๋กค ํ˜•ํƒœ์˜ ๋‹จ์ผ ์—ด ๋ชฉ๋ก๊ณผ 2) ์—ด๊ณผ ํ–‰์˜ ์Šคํฌ๋กค ๊ทธ๋ฆฌ๋“œ์ด๋‹ค.

    728x90