์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- IEEE 802
- ๊ฐ๋ฐ์์ทจ์
- ์ฐ๋ถํฌdb
- ๋ฐ์ดํฐ ์ ์ก
- mariadb
- xv6
- til
- 99ํด๋ฝ
- ๋น์ฃผ๊ธฐ์ ํธ
- ์์๋ฒํธ
- ์ค๋ธ์
- ํ๋ก์ด๋์์
- ์๋น์ค ํ๋ฆฌ๋ฏธํฐ๋ธ
- well known ํฌํธ
- ์ค๋ฅ๊ฒ์ถ
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- git merge
- ์ฃผ๊ธฐ์ ํธ
- tcp ์ธ๊ทธ๋จผํธ
- ํ๋ ์ ๊ตฌ์กฐ
- ํญํด99
- ์ฝ๋ฉํ ์คํธ์ค๋น
- ์ค๋ฅ์ ์ด
- reducible
- i-type
- ํ ํฐ ๋ฒ์ค
- leetcode
- tcp ํ๋กํ ์ฝ
- ์ค๋ ๋
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- Today
- Total
Unfazedโ๏ธ๐ฏ
์ฑํ๋ก๊ทธ๋๋ฐ - ์ค๊ฐ๊ณ ์ฌ ๋๋น ๋ณธ๋ฌธ
์ฑํ๋ก๊ทธ๋๋ฐ - ์ค๊ฐ๊ณ ์ฌ ๋๋น
9taetae9 2024. 10. 29. 15:521. 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 ํ์ผ์ ์ค์ ํ๋ฉด์ ํ์ํ ์ ์๋ ์ธ์คํด์ค๋ค๋ก ๋ณํํ๋ ์ค์ํ ์ญํ ์ ํ๋ค. ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
- ์ง์ ๋ ๋ ์ด์์ .xml ํ์ผ์ ์ฝ๊ธฐ
- .xml ํ์ผ์ ์ ์๋ ๋ชจ๋ View ์์๋ค์ ์ค์ View ํด๋์ค์ ์ธ์คํด์ค๋ก ๋ณํ
- ์๋ฅผ ๋ค์ด <Button> ํ๊ทธ๋ Button ํด๋์ค์ ์ธ์คํด์ค๋ก,
- <TextView> ํ๊ทธ๋ TextView ํด๋์ค์ ์ธ์คํด์ค๋ก ๋ณํ
- ์์ฑ๋ View ์ธ์คํด์ค๋ค์ .xml ํ์ผ์ ์ ์๋ ๊ณ์ธต ๊ตฌ์กฐ๋๋ก ์กฐ๋ฆฝ
- ์์ฑ๋ 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 ์ค์ ์ ๊ธ์จ๊ฐ ์๋ณด์ผ ์๋ ์์.