๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

์•ฑํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์ค‘๊ฐ„๊ณ ์‚ฌ ๋Œ€๋น„ ๋ณธ๋ฌธ

Android (์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑํ”„๋กœ๊ทธ๋ž˜๋ฐ)

์•ฑํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์ค‘๊ฐ„๊ณ ์‚ฌ ๋Œ€๋น„

9taetae9 2024. 10. 29. 15:52
728x90

1. Android ์•ฑ ๋’ทํŽธ์— ์žˆ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ ์ง€ ์•Š์€ ๋ณ„๋„์˜ Code๋“ค์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ์„ธ ๊ฐ€์ง€

  • ๊ธฐ๊ธฐ์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๊ฐ์ข… ์ž…๋ ฅ์„ ๋‹ค๋“ฌ์–ด ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
  • ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด ๋‘” ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

.xml ํŒŒ์ผ๋“ค ๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ resource, ์ฝ์„ ๋Œ€์ƒ์œผ๋กœ์จ ์กด์žฌํ•œ๋‹ค. .xml ํŒŒ์ผ์— ๋‚ด์šฉ์„ ์ ๊ณ  ์•ฑ์„ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•˜๋ฉด ์•ฑ ๋’ค์—์„œ๋Š” ๊ทธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ ๋‹นํ•œ ํƒ€์ด๋ฐ์— ์ฝ์–ด์ค€๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ๋‚ด์šฉ๋“ค์„ ์‚ฌ์šฉํ•˜๋„๋ก .java ํŒŒ์ผ์„ ์ ์–ด ๋‘ ์œผ๋กœ์จ ์šฐ๋ฆฌ ์•ฑ์˜ Data ํ๋ฆ„์„ ๋ชฉํ‘œ์— ๋งž๊ฒŒ ๋งˆ๋ จํ•  ์ˆ˜ ์žˆ๋‹ค. 

  • ์ข…ํ•ฉ์  ํŒ๋‹จ์— ์˜๊ฑฐํ•˜์—ฌ ์•ฑ์˜ ์‹คํ–‰์„ ์ค‘๋‹จ

2. XML ํ˜•์‹์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ View๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„ => ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„(ํฌํ•จ ๊ด€๊ณ„)
์ด๋•Œ(์ฃผ๋กœ View ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด) .xml ํŒŒ์ผ์— ์ ๋Š” ์š”์†Œ์˜ ๋ช…์นญ์€ ๋ฌด์—‡์ธ๊ฐ€? =>
<Parent> </Parent> ๊ฐ™์€ ๊ฒƒ ์‚ฌ์ด์— <Child> </Child>๋ฅผ ์ ๋Š” ๋“ฑ, XML element (XML ์š”์†Œ)
xml element : ์ด๋ฆ„, attribute ๋ฐ ๋‚ด์šฉ๋ฌผ ์ ์–ด ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
 
3. ์•ฑ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด .xml ํŒŒ์ผ๊ณผ .java ํŒŒ์ผ์„ ์กฐํ•ฉํ•˜์—ฌ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์•ฑ์„ ์ฒ˜์Œ ์ผฐ์„ ๋•Œ ํ™”๋ฉด ํ•œ ๊ฐ€์šด๋ฐ์— "์•ˆ๋…•ํ•˜์„ธ์š”!"๋ผ๊ณ  ์ ํžŒ TextView ํ•˜๋‚˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ •ํ•˜์—ฌ, .xml ํŒŒ์ผ๊ณผ .java ํŒŒ์ผ์ด ๊ฐ–๋Š” ์˜๋ฏธ(์–ด๋–ค ๊ฒƒ์„ ์ •ํ•˜๋Š”์ง€)๋ฅผ ์„œ์ˆ ํ•˜์‹œ์˜ค.
.xml ํŒŒ์ผ : ํ™”๋ฉด์ƒ ๊ตฌ์กฐ์™€ ๋ฐฐ์น˜ ("์–ด๋–ป๊ฒŒ") => <TextView ~~~ />
.java ํŒŒ์ผ : ๋™์ž‘๊ณผ ๊ธฐ๋Šฅ ์ •์˜ ("์–ธ์ œ"๊ฐ€ "์—ฌ๊ธฐ ์‹คํ–‰ํ•  ๋•Œ"๋กœ ํŠน์ •๋จ) => setContentView(R.layout.activity_main);
์‹ค์ œ TextView '์ธ์Šคํ„ด์Šค'๋Š” ์ด ๋‘ ํŒŒ์ผ์˜ ์กฐํ•ฉ์„ ํ†ตํ•ด ๊ทธ๋•Œ(.java), ๊ทธ๋ ‡๊ฒŒ(.xml) ์ƒ์„ฑ๋œ๋‹ค.
์ธ์Šคํ„ด์Šค : ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” '์‹ค๋ฌผ'
 
4. findViewById(R.id.tv)์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹์ด ๊ฐ–๋Š” ์˜์˜
Android Studio๋Š” class R์— ๋Œ€ํ•œ ํด๋ž˜์Šค ์ •์˜๋ฅผ ๋’ค์—์„œ ์ง์ ‘ ์ ์–ด์ค€๋‹ค. (.xmlํŒŒ์ผ๊ณผ .java ํŒŒ์ผ์˜ ์—ฐ๋™์„ ๋•๊ธฐ์œ„ํ•ด)
ํ”„๋กœ์ ํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ๋˜ .xml ํŒŒ์ผ๋“ค์„ ๋ฏธ๋ฆฌ ์—ด์–ด์„œ ๊ทธ ํŒŒ์ผ๋“ค ์ž์ฒด ๋ฐ ๊ทธ ์•ˆ์— ์ ํ˜€ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ์ฝ๋Š”๋‹ค.
 
์ฝ์€ ๋‚ด์šฉ๋“ค ์ค‘ ์ผ๋ถ€๋ฅผ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ Java ์ฝ”๋“œ๋ฅผ ์ ์„ ๋•Œ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ ์ด๋ฆ„๋“ค์— ๋Œ€ํ•œ ์„ ์–ธ์„ ์ง์ ‘ ์ ์–ด ๊ฐ€๋ฉฐ class R ์ •์˜๋ฅผ ๊ตฌ์„ฑํ•ด์ค€๋‹ค.
์ด ๋•Œ ์ƒˆ๋กœ ๋„์ž…๋œ ๊ฐ ์ด๋ฆ„๋“ค์€ Android Studio๊ฐ€ ์ง€์ •ํ•œ ์ˆซ์ž์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ex) tv_helloworld = 1300000 
 
์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ Android Studio๊ฐ€ ์„ ์–ธ์„ ์ ์–ด ๋‘” ์ด๋ฆ„๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ์ ์Œ์œผ๋กœ์จ
์˜๋ฏธ ๊ด€์ ์—์„œ๋Š” .xml ํŒŒ์ผ ๋‚ด์šฉ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ, 
๊ฐ’ ๊ด€์ ์—์„œ๋Š” Android Studio๊ฐ€ ๊ณจ๋ผ ๋‘” ์ˆซ์ž๋ฅผ ์“ฐ๋„๋ก Java ์ฝ”๋“œ๋ฅผ ์ ๊ฒŒ ๋œ๋‹ค.
 
setContentView(R.layout.activity_main); => ํ•ด๋‹น ์‹œ์ ์— .xml ํŒŒ์ผ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์ƒˆ TextView ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.
์ด๋ ‡๊ฒŒ ๋งŒ๋“  TextView ์ธ์Šคํ„ด์Šค๋Š” .xml์—  <TextView android:id="@+id/tv_helloworld" ๋ผ๊ณ  ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์ด๊ฒƒ๊ณผ ์—ฐ๊ฒฐ๋œ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
Activity์—์„œ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋ ˆ์ด์•„์›ƒ์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ.
์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด activity_main.xml ํŒŒ์ผ์— ์ •์˜๋œ UI ์š”์†Œ๋“ค์ด ํ˜„์žฌ Activity์— ๋กœ๋“œ๋˜๊ณ  ํ‘œ์‹œ๋œ๋‹ค.
์ด ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Activity์˜ onCreate() ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ํ˜ธ์ถœ๋œ๋‹ค. ํ˜ธ์ถœ ์‹œ์ ์—์„œ activity_main.xml์— ์ •์˜๋œ ๋ชจ๋“  ๋ทฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด findViewById๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ๋ทฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
 
TextView tv = findViewById(R.id.tv_helloworld) => setContentView(R.layout.activity_main)์œผ๋กœ ๋“ฑ๋กํ•œ TextView ์ธ์Šคํ„ด์Šค๋ฅผ ํŠน์ •ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ทธ ์ด๋ฆ„(์ˆซ์ž)๋ฅผ ์ ์œผ๋ฉด ๋œ๋‹ค. Android Studio๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘” ์ด๋ฆ„ R์„ ์จ์„œ ๊ตฌ์„ฑํ•˜๋ฉด ๋œ๋‹ค.
 
 
 
<resources>
   <stirng name="app_name">HelloWorld</string>
    <string name="msg_negative">์•ˆ๋…•ํ•˜์ง€ ๋งˆ์„ธ์š”</string>
<resources>
 
tv.setText(R.string.msg_negative); => '์–ธ์ œ ์ƒ์„ฑํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์•„๋ฌดํŠผ ๊ทธ String ์ธ์Šคํ„ด์Šค'๋ฅผ ํŠน์ •ํ•  ๋•Œ ์ด๋ ‡๊ฒŒ ์ ์šฉ
์ด๋ฅผ ์กฐํ•ฉํ•˜๋ฉด, 'ํ•ด๋‹น ์ธ์Šคํ„ด์Šค'์˜ Text attribute๋ฅผ msg_negative๋กœ ์ง€์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ.
 
findViewById(R.id.tv_helloworld)  : ๋ฏธ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๋“ฑ๋กํ•ด ๋‘” ์ธ์Šคํ„ด์Šค ์ฐพ์•„ ์ง์ ‘๋‹ค๋ฃจ๊ธฐ
์‹œ์  : ์ผ๋ฐ˜์ ์œผ๋กœ activity์˜ onCreate() ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ํ˜ธ์ถœ๋œ๋‹ค. ๋ ˆ์ด์•„์›ƒ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ(setContentView(R.layout.activity_main);)๋œ ์ดํ›„์ด๋‹ค.
setContentView(R.layout.activity_main) ๊ธฐ๋Šฅ : XML์—์„œ ์ •์˜๋œ View๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ทฐ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
 
์—ฐ๊ฒฐ : R.id.tv๋Š” Android Studio๊ฐ€ ์ง€์ •ํ•œ ์ˆซ์ž์™€ ์—ฐ๊ฒฐ๋˜์–ด, java ์ฝ”๋“œ๋Š” xml ์— ์ •์˜๋œ ํŠน์ • View๋ฅผ ์ •ํ™•ํžˆ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
 
์ด๋ ‡๊ฒŒ ์ฐพ์•„๋‚ธ ๋ทฐ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ํ…์ŠคํŠธ ๋ณ€๊ฒฝ, ๊ฐ€์‹œ์„ฑ ์กฐ์ ˆ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์„ค์ • ๋“ฑ ๋‹ค์–‘ํ•œ ๋™์  ์กฐ์ž‘์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
๊ทธ ์ˆ˜์‹์ด ์ ํ˜€ ์žˆ๋Š” ๋ฌธ์žฅ์„ ์‹คํ–‰ํ•  ๋•Œ, ์ ์ ˆํžˆ ๋ฏธ๋ฆฌ ์ฝ์–ด ๋‘” .xml ํŒŒ์ผ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ณผ์ •
 
1. ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜์—ฌ ๋“ฑ๋กํ•˜๊ธฐ                                                                         setContentView(R.layout.activity_main);
2. ๋ฏธ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๋“ฑ๋กํ•ด ๋‘” ์ธ์Šคํ„ด์Šค ์ฐพ์•„ ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ                                            TextView tv = findViewById(R.id.tv);
3. ๋ฏธ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๋“ฑ๋กํ•ด ๋‘” ์ธ์Šคํ„ด์Šค ํŠน์ •(R.string.msg_negative)ํ•˜์—ฌ tv์˜ Text attribute๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ                                                                                                                                                             tv.setText(R.string.msg_negative);

โžข TextView.setText()์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์€
๋‚ด๊ฐ€ ์ˆซ์ž๋งŒ ๋‹ด์•„ ํ˜ธ์ถœํ•˜๋ฉด ์•Œ์•„์„œ ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์š”
 
5. class R์€ ๊ทธ ์ •์˜๋ฅผ Android Studio๊ฐ€ ๋’ค์—์„œ ์ง์ ‘ ์ ์–ด ์ค€ ๊ฒƒ์ด๋‹ค.
๋ฌด์—‡์„ ํ† ๋Œ€๋กœ : res ํด๋” ๋‚ด์˜ ๋ชจ๋“  XML ํŒŒ์ผ๋“ค์„ ์Šค์บ”
๋ฌด์—‡์ด ๋“ค์–ด์žˆ๋Š”์ง€ : ๊ฐ ๋ฆฌ์†Œ์Šค์— ๊ณ ์œ ํ•œ ์ •์ˆ˜ ID๋ฅผ ์ž๋™์œผ๋กœ ํ• ๋‹น 
์™œ ์ ์–ด์ฃผ๋Š”์ง€ : XML์˜ ๋ฆฌ์†Œ์Šค์™€ Java ์ฝ”๋“œ์˜ ์—ฐ๋™
 
์‚ฌ์šฉ ์˜ˆ์‹œ)

  • ๊ฐœ๋ฐœ์ž๋Š” R.id.tv_helloworld์™€ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐ
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฅผ ์‹ค์ œ ํ• ๋‹น๋œ ID ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
  • ์ด๋ฅผ ํ†ตํ•ด XML์˜ ๋ฆฌ์†Œ์Šค์™€ Java ์ฝ”๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋จ
public final class R {
    // layout ๋ฆฌ์†Œ์Šค ID
    public static final class layout {
        public static final int activity_main = 0x7f0a0000;
        public static final int fragment_home = 0x7f0a0001;
    }

    // id ๋ฆฌ์†Œ์Šค ID (XML์—์„œ ์ •์˜๋œ ๋ทฐ๋“ค์˜ ID)
    public static final class id {
        public static final int tv_helloworld = 0x7f0b0001;
        public static final int btn_submit = 0x7f0b0002;
    }

    // string ๋ฆฌ์†Œ์Šค ID
    public static final class string {
        public static final int app_name = 0x7f0c0000;
        public static final int hello_message = 0x7f0c0001;
    }

    // drawable ๋ฆฌ์†Œ์Šค ID
    public static final class drawable {
        public static final int ic_launcher = 0x7f0d0000;
    }
}

 
 
์ผ๋ฐ˜์ ์œผ๋กœ onCreate() ๋ฉ”์„œ๋“œ ์ •์˜ ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ ํ˜€ ์žˆ๋˜ setContentView() ํ˜ธ์ถœ์‹์ด ๊ฐ–๋Š” ์˜์˜(ํ˜ธ์ถœํ•˜๋ฉด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€) ‘.xml ํŒŒ์ผ’ ๋ฐ ‘์ธ์Šคํ„ด์Šค’๋ฅผ ์ค‘์‹ฌ์— ๋‘๊ณ  ์„ค๋ช….
 
setContentView()๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•œ .xml ํŒŒ์ผ์„ ์‹ค์ œ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์ง€์ •๋œ ๋ ˆ์ด์•„์›ƒ .xml ํŒŒ์ผ์„ ์ฝ๊ธฐ
  2. .xml ํŒŒ์ผ์— ์ •์˜๋œ ๋ชจ๋“  View ์š”์†Œ๋“ค์„ ์‹ค์ œ View ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜
    • ์˜ˆ๋ฅผ ๋“ค์–ด <Button> ํƒœ๊ทธ๋Š” Button ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ,
    • <TextView> ํƒœ๊ทธ๋Š” TextView ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜
  3. ์ƒ์„ฑ๋œ View ์ธ์Šคํ„ด์Šค๋“ค์„ .xml ํŒŒ์ผ์— ์ •์˜๋œ ๊ณ„์ธต ๊ตฌ์กฐ๋Œ€๋กœ ์กฐ๋ฆฝ
  4. ์™„์„ฑ๋œ View ์ธ์Šคํ„ด์Šค ํŠธ๋ฆฌ๋ฅผ ํ˜„์žฌ Activity์˜ ํ™”๋ฉด์— ์„ค์ •

์ฆ‰, setContentView()๋Š” ์ •์ ์ธ .xml ํŒŒ์ผ์˜ ๋ ˆ์ด์•„์›ƒ ์ •์˜๋ฅผ ์‹ค์ œ๋กœ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•œ View ์ธ์Šคํ„ด์Šค๋“ค๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
 
์ƒ์„ธ์„ค๋ช… 
setContentView() ๋‚ด๋ถ€์—๋Š” LayoutInflater๋ผ๋Š” ์‹œ์Šคํ…œ ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค.

  • ์ด LayoutInflater๊ฐ€ XML ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜๊ณ 
  • ํŒŒ์‹ฑ๋œ ๊ฐ View ํƒœ๊ทธ๋“ค์— ๋Œ€ํ•ด ๋ฆฌํ”Œ๋ ‰์…˜(Reflection)์„ ์‚ฌ์šฉํ•˜์—ฌ
  • ํ•ด๋‹นํ•˜๋Š” View ํด๋ž˜์Šค์˜ new ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

// ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง„ ์•Š์ง€๋งŒ, LayoutInflater ๋‚ด๋ถ€์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค.
Button button = new Button(context);  // <Button> ํƒœ๊ทธ ๋ฐœ๊ฒฌ ์‹œ
TextView textView = new TextView(context);  // <TextView> ํƒœ๊ทธ ๋ฐœ๊ฒฌ ์‹œ
๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„, setContentView() ํ˜ธ์ถœ ํ•œ ๋ฒˆ์œผ๋กœ XML์— ์ •์˜๋œ ๋ชจ๋“  View๋“ค์˜ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
 
 
6. CheckBox์™€ RadioButton์˜ 'ํด๋ฆญ ์‹œ ๋™์ž‘' ์ธก๋ฉด์—์„œ ์ฐจ์ด์ 
CheckBox : ๋‹ค์ค‘ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋˜ํ•œ ํด๋ฆญ ์‹œ true/false ๊ฐ’์ด ๋ณ€๊ฒฝ(ํ† ๊ธ€)๋œ๋‹ค.
RadioButton : ๊ฐ™์€ ๊ทธ๋ฃน ๋‚ด์—์„œ๋Š” ๋‹จ์ผ ์„ ํƒ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ์ž๋™์œผ๋กœ ํ•ด์ œ ๋œ๋‹ค.
 
7. RadioGroup
RadioGroup์„ ํ†ตํ•ด RadioButton๋“ค์„ ๋ชจ์•„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
Component Tree์—์„œ ๋“œ๋ž˜๊ทธํ•ด์„œ ๋‹ด์•„ ๋‘๋ฉด ๋‹ค๋ฅธ RadioButton ํด๋ฆญ์‹œ ๊ธฐ์กด์˜ ํด๋ฆญ ์ƒํƒœ์˜€๋˜ ๊ฒƒ์€ ํ•ด์ œ
isChecked()๋กœ ๋ฒ„ํŠผ ํด๋ฆญ ์ƒํƒœ ํ™•์ธ
 
8. Layout์˜ ์ผ์ข…์—๋Š” ConstraintLayout, LinearLayout, FrameLayout์ด ์กด์žฌํ•œ๋‹ค.
ConstraintLayout์„ ๊ธฐ์ค€์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ๋‹ค๋ฅธ ๋‘ layout์„ ์‚ฌ์šฉ์˜ ์žฅ๋‹จ์ ์„ ๊ฐ๊ฐ ์„œ์ˆ ํ•˜์‹œ์˜ค.
ConstraintLayout (๊ฐ€์žฅ ์„ธ๋ฐ€)
- Layout ๋‚ด ๊ฐ View๋“ค์˜ ๋Œ€ํ•œ ์ƒ/ํ•˜/์ขŒ/์šฐ ๊ทœ์น™์„ ์ง€์ •ํ•ด ๋‘˜ ์ˆ˜ ์žˆ๋‹ค (๋ˆ„๊ตฌ ์˜†, ๋ˆ„๊ตฌ ์•„๋ž˜ ๋“ฑ์„ ์ง์ ‘ ์ง€์ • ๊ฐ€๋Šฅ)
- ๊ฐ View๋“ค์˜ ๋Œ€ํ•œ ๊ฐ€๋กœ/์„ธ๋กœ Bias๋ฅผ ์ง€์ • ๊ฐ€๋Šฅ (๊ทœ์น™์— ์˜ํ•ด ํŠน์ •๋˜๋Š” ์˜์—ญ์—์„œ ๊ทธ View๊ฐ€ ์–ด๋””์ฏค ์œ„์น˜ํ•  ๊ฒƒ์ธ์ง€(๋น„์œจ)๋ฅผ ์ข€ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค)
- ๊ฐ ๋ฒ„ํŠผํŠผ๋“ค์˜ ๋‚˜์—ด ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ, ๊ฐ ๋ฒ„ํŠผ๋“ค์˜ ์‹ค์ œ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•จ.
๋‹จ์  : ๋ฏธ๋ฆฌ ์ง€์ •๋œ ๊ทœ์น™์ด ๋ณ„๋กœ ์—†์–ด ์ƒํ•˜์ขŒ์šฐ ๋“ฑ์˜ ๊ทœ์น™์„ ์ง์ ‘ ์•Œ๋งž๊ฒŒ ์ง€์ •ํ•˜์—ฌํ–ํ•จ.
 
LinearLayout :
๊ฐ ๋ฒ„ํŠผ๋“ค์ด ์ถ”๊ฐ€๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ธฐ์ค€ ์œ„์น˜๊ฐ€ ๊ฒฐ์ •๋˜๊ณ , ๊ทธ ๋ฒ”์œ„ ์•ˆ์—์„œ ์ œํ•œ์ ์ธ ๊ทœ์น™๋“ค์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ. 
ex) BT2์˜ ์„ธ๋กœ ์œ„์น˜๋Š” ๋ฌด์กฐ๊ฑด BT1์˜ ํ•˜๋‹จ์„ ๊ธฐ์ค€์œผ๋กœ ํ•จ.
์žฅ์  : ์ƒˆ View๋“ค์„ ๊ณ‚์น˜์ง€ ์•Š๊ณ  ์ผ์ •ํ•œ ๋ฐฉํ–ฅ(๊ฐ€๋กœ ๋˜๋Š” ์„ธ๋กœ)์œผ๋กœ ๋‚˜์—ดํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ๋•Œ ์šฉ์ด
๋‹จ์  : ๊ทœ์น™์ด ๊ณ ์ •๋˜์–ด ์žˆ์–ด ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ™”๋ฉด์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค. Layout ์˜์—ญ์„ ๋šซ๊ณ  ๋‚˜๊ฐˆ ์ˆ˜๋„ ์žˆ์–ด์„œ ScrollView(FrameLayout์˜ ์ผ์ข…)๋ฅผ ์จ์„œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๋‹ฌ์•„์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 
 
FrameLayout :
๋‹ค๋ฅธ ๋ฒ„ํŠผ๋“ค๊ณผ ์ „ํ˜€ ๋ฌด๊ด€ํ•œ ๊ทœ์น™๋“ค๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.(๊ฐ€๋กœ์œ„์น˜๋Š” Layout์˜ ์™ผ์ชฝ, ์„ธ๋กœ ์œ„์น˜๋Š” Layout ์ƒ๋‹จ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š”๋‹ค)
ex) BT2์˜ ์„ธ๋กœ ์œ„์น˜๋Š” ๋ฌด์กฐ๊ฑด Layout ์ƒ๋‹จ์„ ๊ธฐ์ค€์œผ๋กœ ํ•จ.
์žฅ์  : Layout ๋‚ด ๊ฐ View๋“ค์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ๊ทœ์น™์„ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ณ , margin์„ ์‚ฌ์šฉํ•˜์—ฌ View๋“ค์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ View๋ฅผ Layout์˜ ์ •ํ™•ํžˆ ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๋‹ค.
๋‹จ์  : ๊ฐ View๋ฅผ '์•ˆ๊ฒน์น˜๊ฒŒ' ๋งŒ๋“œ๋ ค๋ฉด ์œ„์น˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ž˜ ์„ค์ •ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
 
 
๊ฒฐ๋ก  :
Layout๊ณผ View ์‚ฌ์ด์˜ ํฌํ•จ ๊ด€๊ณ„(Tree ๊ตฌ์กฐ, Component Tree)๋Š” '.xml ํŒŒ์ผ๋กœ๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ' ๊ณ ์ •์ ์ด๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์–ต์ง€๋กœ Java ์ฝ”๋“œ๋ฅผ ์จ์„œ ํ•œ View๋ฅผ ์—ฌ๋Ÿฌ Layout์— ํฌํ•จ์‹œํ‚ค๋ ค ์‹œ๋„ํ•œ๋‹ค๋ฉด ์•ฑ์ด ๊ฐ•์ œ์ข…๋ฃŒ ๋  ๊ฒƒ์ด๋‹ค.
 
9. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” Java ์ฝ”๋“œ์˜ ํƒœ๋ฐ˜์€ Data ํ๋ฆ„ ๊ด€์ ์—์„œ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์ž‘์—…์˜ ์ˆœ์ฐจ ์‹คํ–‰์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ธ ์ž‘์—…์— ๋Œ€ํ•ด ๊ฐ๊ฐ 20์ž ๋‚ด์™ธ๋กœ ์„œ์ˆ ํ•˜๊ฑฐ๋‚˜, ๊ฐ ์ž‘์—…์— ๋Œ€ํ•ด ์‹ค์งˆ์ ์œผ๋กœ ์ ๊ฒŒ ๋  Java ์ฝ”๋“œ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ œ์‹œํ•˜์‹œ์˜ค.
์ž‘์—…#1 : ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋˜๋Š” ์ˆ˜์ง‘                                          ์–ด๋”” ๋‹ด๊ธด Data ๊ฐ€์ ธ์˜ค๊ธฐ
EditText et = findViewById(R.id.et);
String userInput = et.getText().toString();
 
์ž‘์—…#2 : ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋˜๋Š” ๋ณ€ํ™˜                                         ๋ญ”๊ฐ€ ํ•˜๊ธฐ
int number = Integer.parseInt(userInput);
int result = number * 2;
 
์ž‘์—…#3 : ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๋˜๋Š” ์ €์žฅ                                             ์–ด๋””๋‹ค ๋‹ด๊ธฐ
TextView tv_result = findViewById(R.id.tv_result);
tv_result.setText("๊ฒฐ๊ณผ :" + result);
 
 
10. View์™€ Event
View ์ธ์Šคํ„ด์Šค๋“ค์€ '์–ด๋–ป๊ฒŒ'๋‚˜ '๋ฌด์—‡์„'์— ํ•ด๋‹นํ•˜๋Š” Data๋ฅผ ์ง€๋‹ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ Android์—์„œ๋Š” attribute๋ผ ํ•œ๋‹ค.
Attribute => Data ์ผ์ข…
event => Code ์‹คํ–‰๊ณผ ๊ด€๋ จํ•œ ๊ฐœ๋…
 
Event๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
Event๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  Code๋ฅผ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
์ด ๋‘˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ทธ ๋•Œ ๊ทธ Code๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
๋ฉ”์„œ๋“œ๋Š” '๋ฌธ์žฅ๋“ค' => .xml ํŒŒ์ผ์— ์ ์–ด ๋‘์ง€ ๋ชปํ•œ๋‹ค.
.xml ํŒŒ์ผ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Data ์š”์†Œ๋“ค๋งŒ ์ ํ˜€ ์žˆ๋‹ค.
 
11. 
์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ™”๋ฉด ๋’ค์—์„œ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ„ํŠผ ์ธ์Šคํ„ด์Šค์— ์ง€์ •๋œ ๋ฉ”์„œ๋“œ(onClick) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
onClick(View v) => v : ๊ด€๋ก€์ ์œผ๋กœ, 1๋ฒˆ์งธ ์ธ์ˆ˜ ์ž๋ฆฌ์—๋Š” '๊ทธ ์ธ์Šคํ„ด์Šค'(ํด๋ฆญํ•˜์—ฌ onClick ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ํ•ด๋‹น Button ์ธ์Šคํ„ด์Šค)๋ฅผ ๋‹ด์•„ ์ค€๋‹ค.
 
๋ฉ”์„œ๋“œ/ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ์•ˆ๋“œ๋กœ์ด๋“œ์˜ onClick ๋ฉ”์„œ๋“œ ์ •์˜ ๊ฐ„์˜ ์ฃผ์š” ์ฐจ์ด์ 
ํ˜ธ์ถœ ์ฃผ์ฒด์˜ ์ฐจ์ด
์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€๋งŒ, onClick ๋ฉ”์„œ๋“œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ํ˜ธ์ถœ
์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
onClick ๋ฉ”์„œ๋“œ๋Š” View.OnClickListener ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋กœ, ์‹œ์Šคํ…œ์ด ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ์•ฝ
์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, onClick ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ View ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์•ผ ํ•จ.
์ ‘๊ทผ ์ œ์–ด์ž
onClick ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ public์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ์‹œ์Šคํ…œ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
๋ฐ˜ํ™˜ ํƒ€์ž…
onClick ๋ฉ”์„œ๋“œ๋Š” void ํƒ€์ž…

์ด๋Ÿฌํ•œ ์ œ์•ฝ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์ด ๊ทœ์น™์— ๋”ฐ๋ผ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ์ œ์•ฝ์„ ์ง€์ผœ์•ผํ•œ๋‹ค.
 
12. margin๊ณผ padding
Margin

  • '๋Œ€์ƒ View์™€ ๊ทธ ์ƒ์œ„ View(๋Œ€์ƒ View๋ฅผ ํฌํ•จํ•˜๋Š” View)' ์‚ฌ์ด์—์„œ ์“ฐ๋Š” attribute
  • ์ƒ์œ„ View๊ฐ€ ๋Œ€์ƒ์˜ ์œ„์น˜ ๋ฐ ํฌ๊ธฐ๋ฅผ ์ •ํ•  ๋•Œ ๊ทธ๋งŒํผ์˜ ์ถ”๊ฐ€ ๊ณต๊ฐ„์„ ๊ฐ์•ˆํ•˜์—ฌ ์ •ํ•ด ์คŒ
  • Margin ์˜์—ญ์€ ๋Œ€์ƒ View ๊ฒƒ์ด ์•„๋‹˜

Layout๋“ค์€ ์—ฌ๋Ÿฌ ํ•˜์œ„ View๋“ค์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ํ•˜์œ„ View๋“ค์— ๋Œ€ํ•œ margin๋“ค ์—ญ์‹œ ๊ฐ๊ฐ ๋”ฐ๋กœ ๊ฐ์•ˆํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
๊ทธ๋ž˜์„œ layout.setMarginOfChildren() ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋Š” ์‚ฌ์šฉ์ด ์–ด๋ ต๊ณ , ๋ณ„๋„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ณ๋“ค์—ฌ ์จ์•ผํ•œ๋‹ค.
์˜ˆ) ๋ฒ„ํŠผ ํด๋ฆญ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฒ„ํŠผ nb๋“ค์„ Framelayout ์ƒ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง์ด๋‹ค.
๊ฐ ๋ฒ„ํŠผ์˜ margin์„ params.leftMargin, params.TopMargin์œผ๋กœ ์„ค์ •ํ•œ๋’ค layout.addView๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค.

FrameLayout layout = findViewById(R.id.layout);
CheckBox cb = findViewById(R.id.cb);
Button nb = new Button(this);

//๋ฒ„ํŠผ ํฌ๊ธฐ ์„ค์ •(FrameLayout.LayoutParams(width, height))
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( 50, 50);

//์œ„์น˜์„ค์ •(๋งˆ์ง„)
if(lastX == -1 && lastY == -1){
    params.leftMargin = 50;
    params.topMargin = 50;
}else{
    params.leftMargin = cb.isChecked() ? lastX + 10 : lastX;
    params.topMargin = lastY + 10;
}

lastX = params.leftMargin;
lastY = params.topMargin;

layout.addView(nb, params);
//๋ฒ„ํŠผ์˜ ํฌ๊ธฐ
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
        150, 150
);
//์œ„์น˜(layout ์™ผ์ชฝ์œผ๋กœ ๋ถ€ํ„ฐ ๋งˆ์ง„, layout ์ƒ๋‹จ์œผ๋กœ ๋ถ€ํ„ฐ ๋งˆ์ง„)
params.leftMargin = rand.nextInt(layout.getMeasuredWidth() - 150);
params.topMargin = rand.nextInt(layout.getMeasuredHeight() - 150);

 
layout.addView(bt, params); ์›ํ•˜๋Š” ๋‚ด์šฉ๋ฌผ(bt.setText())์„ ๊ฐ–๋Š” ๋ฒ„ํŠผ์„ ์›ํ•˜๋Š” ํฌ๊ธฐ์™€ ์œ„์น˜(params)๋กœ layout ํฌํ•จ
 
Padding

  • '๋Œ€์ƒ View์™€ ๊ทธ ๋‚ด์šฉ๋ฌผ' ์‚ฌ์ด์—์„œ ์“ฐ๋Š” attribute
    • ๋‚ด์šฉ๋ฌผ์ด๋ผํ•จ์€ ํ•˜์œ„ View(๋Œ€์ƒ View๊ฐ€ ํฌํ•จํ•˜๋Š” View)๋‚˜ Button ๋“ฑ์˜ ๊ธ€์ž๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜์—ญ
  • ๋Œ€์ƒ View๊ฐ€ ๋‚ด์šฉ๋ฌผ์˜ ์œ„์น˜ ๋ฐ ํฌ๊ธฐ๋ฅผ ์ •ํ•  ๋•Œ ๊ทธ๋งŒํผ์˜ ์ถ”๊ฐ€ ๊ณต๊ฐ„์„ ๊ฐ์•ˆํ•˜์—ฌ ์ •ํ•จ
  • Padding ์˜์—ญ์€ ๋Œ€์ƒ View์˜ ๊ฒƒ์ž„

 
๋ชจ๋“  View๋“ค์€ ์ƒ์œ„ View๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Layout๊ณผ ํ•˜์œ„ View๋“ค์— ๋Œ€ํ•œ padding์€ Layout์—๋งŒ ์ง€์ •ํ•ด ๋‘์–ด๋„ ๋œ๋‹ค.
ex) layout.setPadding(left, top , right, bottom); 
 
13. ๋‹จ์ˆœ ํด๋ฆญ์ด ์•„๋‹Œ '๊ธ€์ž ๋ฐ”๋€œ'์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ํ—จ๋“ค๋Ÿฌ ์ง€์ •

EditText et = findViewById(R.id.et);

et.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

 
14. onCreate() ์‹คํ–‰์ด ๋๋‚˜๋„ ๊ธฐ๊ธฐ์— ์ „์›์ด ๋‚จ์•„ ์žˆ๋Š” ์ด์ƒ ์•ฑ์€ ๊ณ„์† ์‹คํ–‰๋œ๋‹ค. ์•ฑ์˜ ์‹คํ–‰ํ๋ฆ„ ์–ด๋”˜๊ฐ€์— ๋ฐ˜๋ณต ๊ตฌ์กฐ๊ฐ€ ์กด์žฌํ•จ์„ ์˜๋ฏธ.
๋Œ€์‹ , ์šฐ๋ฆฌ ์•ฑ ๋’ทํŽธ์— ์žˆ๋Š” ๋ณ„๋„์˜ Code๋“ค์ด ๋™์ž‘ํ•จ์œผ๋กœ์จ
๊ธฐ๊ธฐ์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๊ฐ์ข… ์ž…๋ ฅ์„ ๋‹ค๋“ฌ์–ด ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ (๊ธฐ๊ฐ์ž…๋‹ค) ๊ธฐ๊ธฐ์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๊ฐ์ข… ์ž…๋ ฅ๋“ค์„ ๋‹ค๋“ฌ์–ด ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘” ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ (๋ฏธ์ž‘ํŒŒ์ฝ) ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘” ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์„ ์ฝ์–ด ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
๋ฏธ๋ผ ์ž‘์„ฑํ•ด๋‘” ํŒŒ์ผ ? => .xml ํŒŒ์ผ ๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ resource, ์ฝ์„ ๋Œ€์ƒ์œผ๋กœ ์กด์žฌํ•œ๋‹ค. 
์ข…ํŒ์  ํŒ๋‹จ์— ์˜๊ฑฐํ•˜์—ฌ ์•ฑ์˜ ์‹คํ–‰์„ ์ค‘๋‹จ (์ข…ํŒ์ค‘) ์ข…ํ•ฉ์  ํŒ๋‹จ์— ์˜๊ฑฐํ•˜์—ฌ ์•ฑ์˜ ์‹คํ–‰ ์ค‘๋‹จ 
 
 
15. ํ™”๋ฉด ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์š”์†Œ(ConstraintLayout, LinearLayout, FrameLayout)๋ฅผ ๊ตณ์ด ๋งŒ๋“ค์–ด ๋‘” ์ด์œ ๋Š”
1) ๊ธฐ๊ธฐ๋งˆ๋‹ค ํ™”๋ฉด ํฌ๊ธฐ๋‚˜ ์ข…ํšก๋น„๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
2) ๋ชฉํ‘œ์— ๋”ฐ๋ผ ํ™”๋ฉด ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ์ž์œ ๋„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ
 
16. Toast => ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™”๋ฉด '์œ„'์— ๋„์šฐ๊ธฐ(ํŒ์—… ๋„์šฐ๊ธฐ)
Toast.makeText(this, "์•Œ๋ฆผ", Toast.LENGTH_LONG).show();
 
 
17. ConstraintLayout์˜ Bias vs gravity & padding
 ConstraintLayout์˜ Bias๋ฅผ ํ†ตํ•œ ๋ฐฐ์น˜ : ํ™”๋ฉด์ƒ ๋ฐฐ์น˜์—์„œ ๋น„์œจ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ™”๋ฉด์—์„œ๋„ ๋น„์œจ ์œ ์ง€ ๊ฐ€๋Šฅ
gravity & padding ๋ฅผ ํ†ตํ•œ ๋ฐฐ์น˜ : ์ข…ํšก๋น„๊ฐ€ ์ž์‹ ์ด ์„ค์ •ํ•œ ๊ฒƒ๊ณผ ๋‹ฌ๋ผ์งˆ ๊ฒฝ์šฐ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ.
 
๊ธ€์”จ 2์ค„๋กœ ๋ณด์ด๋Š” ๊ฒƒ => ํ•œ์ค„์— ๋ณด์ด๊ฒŒ ํ•˜๋ ค๋ฉด? ๋ฒ„ํŠผ ๋‚ด๋ถ€์ธ padding์„ ์ˆ˜์ • 0dp๋กœ ์ˆ˜์ •์‹œ ํ•œ์ค„๋กœ ๋ณด์ž„
๋ฐ˜๋Œ€๋กœ 40dp ์ฒ˜๋Ÿผ ํฌ๊ฒŒ padding ์„ค์ •์‹œ ๊ธ€์”จ๊ฐ€ ์•ˆ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Œ.
 

728x90