Skip to content

wnsdudSoftkim/Learning-Android

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

10 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Learning Android

์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต๋ถ€ ๊ฐœ๋ฐœ ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

  1. ์„œ๋ฒ„๊ฐœ๋ฐœ์ž 2.ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž(ํ”„๋ŸฐํŠธ) -์•ˆ๋“œ๋กœ์ด๋“œ -IOS -์›น -ํ†ตํ•ฉ ๊ฐœ๋ฐœ์ž 3. ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž 4. ๋จธ์‹  ๋Ÿฌ๋‹ ๊ฐœ๋ฐœ์ž 5. ์ž„๋ฒ ใ…ก ๊ฐœ๋ฐœ์ž 6. ๋ณด์•ˆ ๊ฐœ๋ฐœ์ž

    ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ๋‹ค์–‘ํ•œ ์ธํ’‹ => ๊ธฐํš => ๋””์ž์ธ => ๊ฐœ๋ฐœ(์„œ๋ฒ„)=>๊ฐœ๋ฐœ(ํด๋ผ์ด์–ธํŠธ) =>๊ฒ€์ˆ˜

Slack์ด๋ž€? ์นดํ†ก ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฒ„์ „์ด๋ผ๊ณ  ์ƒ๊ฐ

์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์„ค์น˜ํ•˜๊ธฐ SDK ๊ฒฝ๋กœ ์„ค์ •! ์ฝ”ํ‹€๋ฆฐ์ด๋ž€ ? 2017 ์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต์‹์ง€์›์–ธ์–ด๋กœ ์ฑ„ํƒ ์ž๋ฐ”์™€ 100% ํ˜ธํ™˜์ด ๋œ๋‹ค.

res layout activity_main ํŒŒ์ผ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์•ˆ๋“œ๋กœ์ด๋“œ ๋ ˆ์ด์•„์›ƒ ํ™”๋ฉด์ด ์žˆ์Œ ํ•ธ๋“œํฐ ๋งˆ๋‹ค ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ๋ฐ ์–ด๋–ป๊ฒŒ ํ™”๋ฉด์„ ๊ทธ๋ ค์•ผ ํ• ์ง€? -> ํ”ฝ์…€,dpi dp๋‹จ์œ„ = ํ”ฝ์…€ => ํ•ธ๋“œํฐ ํ™”๋ฉด์—์„œ ๋น›์ด ๋‚˜์˜ค๋Š” ์ „๊ตฌ -> ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„ -dpi => dot per inch ex) ldpi -> 120 Mdpi => 160 Hdpi => 240 Xhdpi =-> 320 -dp -> density independent pixel -ํ”ฝ์…€ ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„ ์šฐ๋ฆฌ๊ฐ€ ๋™์ผํ•œ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„  dp ๋‹จ์œ„๋ฅผ ์จ์•ผํ•จ./ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ํ™”๋ฉด์„ ๊ทธ๋ฆด๋• 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ 1.xml์„ ์ง์ ‘ ํƒ€์ดํ•‘ ํ•˜๋Š” ๋ฐฉ๋ฒ• 2.drag and drop Java ๋””๋ ‰ ์•ˆ์— MainActivity ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ ˆ์ด์•„์›ƒ ๋ณด์—ฌ์ฃผ๋Š” ๊ณณ์ด ์—ฌ๊ธฐ์ž„ setContentView(R.layout.activity_main)

Drag and drop ๋ฐฉ์‹์œผ๋กœ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์–ด๋ ค์›€.

Activity_main ๋งจ ์œ„์—์„œ Layout_width Layout_height Textview ์˜ ์†์„ฑ์œผ๋ก  ํฌ๊ธฐ ์ƒ‰์ƒ ๋“ฑ์ด ์žˆ์ง€๋งŒ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ€์ˆœ ์—†์Œ. ์ฆ‰ ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ ๋“ค๋กœ ๋ฐฐ์น˜๋ฅผ ํ•ด์•ผํ•จ

์ฒ˜๋Ÿผ LinearLayout - orientation ="verticle"--์ˆ˜์ง๋‚˜์—ด ์œ„์—์„œ ์•„๋ž˜๋กœ "horizontal" ==---์™ผ ์—์„œ ์šฐ๋กœ ๋‚˜์—ด LinearLayout ์ด ๋ถ€๋ชจ ๋ทฐ๋กœ ์žˆ์œผ๋ฉด TextView ์— ์ƒ๊ธฐ๋Š” ์†์„ฑ์€ Android:layout_grayvity=center or right or left ์ด๊ฑด justify-content ์†์„ฑ์ด๋ž‘ ๋˜‘๊ฐ™์Œ LinearLayout ์— gravity ์†์„ฑ์ด ์žˆ์Œ. ์ด๊ฑฐ๋ž‘ ์œ„์—๋ž‘ ํ•ฉ์ณ์„œ ํ•˜๋ฉด ์›ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ๊ฐ€๋Šฅํ• ๋“ฏ. Layoutgravity-๋ถ€๋ชจํด๋ž˜์Šค ๊ธฐ์ค€ Gravity - ๋‚ด ๊ธฐ์ค€ android:gravity="right|center"----- ์˜ค๋ฅธ์ชฝ์ค‘์•™์ •๋ ฌ ใ… ใ…

match_parent ๋Š” ๋ถ€๋ชจ์— ๋”ฑ ๋งž์ถ”๊ฒ ๋‹ค๋Š” ์˜๋ฏธ Wrap_content ๋Š” ๋‚˜์˜ ๋‚ด์šฉ๋ฌผ๋งŒํผ์„ ์‚ฌ์ด์ฆˆ๋กœ ํ•˜๊ฒ ๋‹ค.

Layout_weight -๋น„์œจ ์„ค์ • ๋ถ€๋ชจ์— weightSum์„ 5๋กœ ์ฃผ๊ณ  ์ž์‹์— weight๋ฅผ 1 3 1 ๋กœ ์ฃผ๋ฉด 1:3:1 ๋น„์œจ๋กœ ์„ค์ •๋จ --๊ธฐ์ค€์ด ์žˆ๊ณ  ๊ทธ ๊ธฐ์ค€์—๋”ฐ๋ผ ์ƒ๋Œ€์ ์œผ๋กœ ์น˜ํ•˜๋Š” ๊ฒƒ. ๋”ฐ๋ผ์„œ ์—ฐ์‚ฐ์ด ๋งŽ์ด ํ•„์š”ํ•จ (RElativeLayout์˜ ์ž์‹ ์†์„ฑ์ด ์ƒ๊น€) -centerinParent=""(๊ฐ€์šด๋ฐ) -alignParentBottom=""(์™ผ์ชฝ์•„๋ž˜) ๋งŒ์•ฝ ๊ฐ€์šด๋ฐ ์•„๋ž˜๋กœ ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด ๋‘˜๋‹ค ์“ฐ๋ฉด๋จ. ์ด๋Ÿฐ๊ฑฐ ํ•˜๋‚˜๋„ ์•ˆ์™ธ์›Œ๋„ ๋Œ ์“ธ๋•Œ๋งˆ๋‹ค ์ž๋™์™„์„ฑ์œผ๋กœ ํ™•์ธํ•ด์„œ ์‚ฌ์šฉํ•˜์‹œ์˜ค. ๊ฐ๊ฐ ์€className์ฒ˜๋Ÿผ id๊ฐ€ ์žˆ์Œ Android:id="@+id/์•„์ด๋””์ด๋ฆ„ Toleftof torightof toaboveof ๋“ฑ๋“ฑ ์ž˜ ํ™œ์šฉํ•ด์„œ ๋ ˆ์ด์•„์›ƒํ•˜๊ธฐ , ์ž์‹๋“ค์„ ๊ฒน์ณ์„œ ๋ ˆ์ด์•„์›ƒ์„ ํ•˜๊ณ  ์‹ถ์„๋•Œ ๋จผ์ € ์ ์€๊ฒƒ๋ถ€ํ„ฐ ์Œ“์ด๋Š” ๋А๋‚Œ. ๋จผ์ € ์ ์€๊ฒŒ ๋ฐ‘์—๊ฐ€์žˆ์Œ ๋‘˜์ค‘์— ๋ญ˜ ์จ์•ผ ํ•˜๋ƒ? => FrameLayout ์™œ๋ƒ๋ฉด FrameLayout์ด ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ค๊ณ„๋œ ๊ฒƒ ์ด๊ธฐ ๋•Œ๋ฌธ, Relative๋Š” ์—ฐ์‚ฐ๋Ÿ‰๋„ ๋งŽt๋‹ค. ์Šคํฌ๋กค ํ•ด์ฃผ๊ธฐ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ Scrollview์˜ ํŠน์ง• - ์˜ค์ง ํ•˜๋‚˜์˜ ์ž์‹๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด ์Šคํฌ๋กค ๋จ. ์†์„ฑ - height ๋ฅผ ์ฃผ๋ฉด ๊ทธ height์—์„œ๋งŒ ์Šคํฌ๋กค ๋จ -scrollbars ๋ฅผ ์ฃผ๋ฉด ์Šคํฌ๋กค๋ฐ” ์—†์–ด์ง. -fillViewport="true"๋ฅผ ํ•ญ์ƒ ์ค˜์•ผํ•จ ์†์„ฑ - src-๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ„ -"@drawable/ํŒŒ์ผ์ด๋ฆ„" ------------------Android------------------------------- appํ•˜์œ„manifests/AndroidManifest.xml ์€ ์•ฑ์˜ ์ง€๋„์—ญํ™œ์„ ํ•จ ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผํ•จ package="com.example.myapplication">

<application android:allowBackup="true" --์•ฑ์„ ์‚ญ์ œํ•˜๋”๋ผ๋„ ์ผ์ •๋ถ€๋ถ„์€๋ฐฑ์—…๋˜์žˆ์Œ android:icon="@mipmap/ic_launcher" -@๋Š” ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•˜๊ณ  ์ด ํƒœ๊ทธ๋Š” ํ•ธ๋“œํฐ ์•„์ด์ฝ˜์„ ์˜๋ฏธํ•จ android:label="@string/app_name"-์•ฑ ์ด๋ฆ„

android:roundIcon="@mipmap/ic_launcher_round"- ์•ฑ์˜ ์•„์ด์ฝ˜์„ ๋™๊ทธ๋ž—๊ฒŒ ๊ทธ๋ ค์คŒ(์—ฌ๊ธฐ์„œ ๋ฏธ๋‹ˆ๋งต์€ resํ•˜์œ„ ์ธ๋ฐ ์•ฑ์˜ ์•„์ด์ฝ˜์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด๋จ) android:supportsRtl="true"-๋‹ค๋ฅธ์ง€์—ญ ์–ธ์–ด๋Š” ์˜ค๋ฅธ์ชฝ ->์™ผ android:theme="@style/AppTheme">-์ง€๊ธˆ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์•ฑ์„ ํ‚ค๋ฉด ์œ„์— my application ๋…น์ƒ‰๋ถ€๋ถ„์ด ์ด ํƒœ๊ทธ ๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š” ๊ฒƒ. activityandroid:name=".MainActivity"- ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ํ™”๋ฉด์ž„ ์ฆ‰. ์—ฌ๊ธฐ๋Š” mainActivity ํ™”๋ฉด ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ.

	<intent-filter>
	<actionandroid:name="android.intent.action.MAIN"/>
	
	<categoryandroid:name="android.intent.category.LAUNCHER"/>- ์ด ์†์„ฑ์€ ์ด ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๋Ÿฐ์ฒ˜ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ๋งŒ๋“ฌ ์•ฑ์„ ์ผฐ์„๋•Œ ์ตœ์ดˆ๋กœ ๋‚˜์˜ค๋Š” ํ™”๋ฉด.
	</intent-filter>
</activity>

Activity ๊ฐœ๋… -์•ฑ์˜ ํ•œ ํ™”๋ฉด์ด๋‹ค! -Life Cycle (์ˆ˜๋ช…์ฃผ๊ธฐ) activity ํด์Šค๋Š” 6๊ฐ€์ง€ ์ฝœ๋ฐฑ(A๊ฐ€ ์–ด๋–ค ํŠน์ •ํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๋ฉด B์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š”๊ฒƒ)์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ•ต์‹ฌ์„ธํŠธ(onCreate() onStart() onResume() onPause() onStop() onDestroy())๋ฅผ ์ œ๊ณต https://developer.android.com/guide/components/activities/activity-lifecycle#java

์–ด๋–ค ์ผ์ด ์žˆ์–ด๋„ onCreate๋Š” ๋‹ค์‹œ ๋ถˆ๋ฆด ์ˆ˜ ์—†์Œ ์•ฑ์ด crash  ๋‚ฌ์„๋•Œ ๋นผ๊ณ 
onCreate ->activity๊ฐ€ ๋งŒ๋“ค์–ด์งˆ๋•Œ ๋‹จ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ
			->activity๋ฅผ ๋งŒ๋“ค๋•Œ  ๋‹จ ํ•œ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์ž‘์—…๋“ค์„ ์—ฌ๊ธฐ์„œ ํ•ด์ค€๋‹ค
onStart ->
onResume->๋‹ค์‹œ ์•ฑ์œผ๋กœ ๋Œ์•„์˜ฌ๋•Œ ๋ฌด์กฐ๊ฑด ํ˜ธ์ถœ๋œ๋‹ค
			->activity๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋  ๋•Œ ํ•˜๋ฉด ๋˜๋Š” ์ž‘์—…๋“ค์„ ์—ฌ๊ธฐ์—์„œ ํ•ด์ค€๋‹ค
onPause=>ํ™”๋ฉด ์ผ๋ถ€๊ฐ€ ๊ฐ€๋ ค์กŒ์„๋•Œ
onStop=>ํ™”๋ฉด ์ „๋ถ€๊ฐ€ ๋ณด์ด์ง€ ์•Š์„๋•Œ
		->์‚ฌ์šฉ์ž๊ฐ€ ํ–ˆ๋˜ ์ž‘์—…๋“ค์„  ์ €์žฅ  ์—ฌ๊ธฐ์„œ ํ•ด์ฃผ๋ฉด ์ข‹์„๋“ฏ.
onDestroy->
MainActivity.kt
packagecom.example.myapplication

importandroidx.appcompat.app.AppCompatActivity
importandroid.os.Bundle

classMainActivity:AppCompatActivity(){

overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main). ์ด ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ฒ ๋‹ค
}
}

Bundle ์ด๋ž€?
mainActivity๋ณด๋ฉด import android.os.Bundle ์žˆ์Œ
Bundle ์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” mapํด๋ž˜์Šค์ด๋‹ค
Ex) string ๊ฐ’์„ bundle ํด์Šค์— mapping(๋Œ€์‘,๋ณ€ํ™˜) ํ•˜๋Š”๊ฒƒ
Serializable(๊ฐ์ฒด์ง๋ ฌํ™”)๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ”์ดํŠธ๋กœ ์ €์žฅํ•˜๋Š” ์ž๋ฐ”์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ด๊ณ  Parcelable์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์—์„œ ๋งŒ๋“ ๊ฒƒ.
Android ์—์„œ๋Š” activity ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„๋•Œ bundle ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.
bundle์˜ย ๋‹ค๋ฅธ ์šฉ๋„๋Š”
์•„๋ž˜์™€ ๊ฐ™์ด activity ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ overridefunonCreate(savedInstanceState:Bundle?){ 
Bundle savedinstanceState ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ ์™€์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์ค‘๋‹จํ•  ๋•Œ saveinstancestate ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž„์‹œ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ฆ‰ ์ „์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  activity๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•œ๋‹ค
์ฆ‰ !! Bundle์€ ์•„๋ฌด๊ฑฐ๋‚˜ ํฌ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์ž๋ฅผ ์˜๋ฏธํ•˜๊ณ  ์ด ๋ฐ•์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฆฌ์ €๋ฆฌ ์ธํ…ํŠธ๋„ ์˜ค๊ณ ๊ฐˆ ์ˆ˜ ์žˆ๊ณ  ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์— ์ด์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.
Override fun onCreate(savedInstanceState:Bundle ?) {
	Super.oncreate(savedinstacestate)
	setContentView(R.layout.ํŒŒ์ผ์ด๋ฆ„)
	//์—ฌ๊ธฐ activity๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ  ๋‹จ ํ•œ๋ฒˆ๋งŒ ํ•˜๋Š” ์ž‘์—…
	(๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ generate - > override)
}
classMainActivity:AppCompatActivity(){

	Override funonCreate(savedInstanceState:Bundle?){
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)
		
	}
	
	Override funonStart(){
		super.onStart()
	}
	
	Override funonResume(){
		super.onResume()
	}
	
	Override funonPause(){
		super.onPause()
	}
	
	Override funonStop(){
		super.onStop()
	}
	
	Override funonDestroy(){
		super.onDestroy()
	}
}
Log.d() ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ์ฃผ๋Š”๊ฒƒ 
์‹คํ–‰ ํ›„ logcat ์—์„œ lifecycle์„ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด
์ตœ์ดˆ ์‹คํ–‰์‹œ create ,start, resume์ด ์‹คํ–‰๋Œ
--------------------------------------------------------------
Xml ์— ์ ์–ด๋†“์€ textview๋‚˜ imageview๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ
์›ํ•˜๋Š” ๋™์ž‘์„ ํ•˜๊ฒŒ๋” ๋งŒ๋“ค๊ณ  ์‹ถ์Œ.
-> xml์— ์ ์–ด๋†“์€ view๋ฅผ activity ๋กœ ๊ฐ€์ ธ์™€์•ผํ•จ
Com.exemple ์—์„œ ์˜ค๋ฅธ์ชฝํด๋ฆญ ํ•˜๋ฉด activity ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ  activity ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฑด ํ•œ ํ™”๋ฉด์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ
์ž๋™์œผ๋กœ res layout์—๋„ activity๊ฐ€ ์ƒ๊น€
,์ž๋™์œผ๋กœ manifests/androidmanifest ์—๋„ activity๊ฐ€์ƒ๊น€
///์ต๋ช…ํ•จ์ˆ˜- ์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜-ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค
Xml ์— ์žˆ๋Š” view ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Œ
1.
Val textView:TextView=findViewById(R.id.hello)

overridefunonCreate(savedInstanceState:Bundle?){

super.onCreate(savedInstanceState)

	setContentView(R.layout.activity_linstener)
	valtextView:TextView=findViewById(R.id.hello)
	textView.setOnClickListener{
	
		Log.d("Click","Click")
	}
}
์ด๋ ‡๊ฒŒ ํ•œ๋’ค androidmanifest ์—์„œ mainactivity์— ์žˆ๋Š” ๋ถ€๋ถ„์„ listner ๋กœ ์˜ฎ๊ธฐ๋ฉด ๊ทธ๋ถ€๋ถ„์ด ํ™”๋ฉด์—๋‚˜ํƒ€๋‚จ
๊ทธ๋ฆฌ๊ณ  ํ™”๋ฉด์„ ํด๋ฆญํ–ˆ์„๋•Œ ๋กœ๊ทธ์— click ์ด ์ฐํž˜
์ž‘๋™์›๋ฆฌ = setonClickListener
onClick + Listener 
ํด๋ฆญ์‹œ view๋ฅผ ์ด ๋ฉ”์†Œ๋“œ ์•ˆ์œผ๋กœ ๋„˜๊ฒจ์คŒ ๊ทธ view๊ฐ€ it ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ์Œ
๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์ ‘์†์ž ์ˆ˜ ์ด๋Ÿฐ๊ฑธ ๋”ฐ๊ณ  ์‹ถ์–ด์„œ number"์„ 1 ์”ฉ ์ฆ๊ฐ€ํ•˜๊ฒŒ ํ•˜๊ณ  create์— ๋„ฃ๊ณ  log.d("number",number) ๋กœ ํ•˜๋ฉด ์•ˆ๋จ
์ŠคํŠธ๋ง์„ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๋ฏ€๋กœ log.d("number",""+number) ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ string์œผ๋กœ ๋ณ€ํ™˜๋จ
๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ
-setText - ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๊พธ์–ด์คŒ
-setImageResource(///image.setImageResource(R.drawable.//ํŒŒ์ผ์ด๋ฆ„)
 ์ •์ ์ธ ๋ทฐ๋ฅผ ๋งŒ๋“ค๋•Œ๋Š” xml์—์„œ ๊ทธ๋ฆฌ๊ณ  ๋™์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์„๋• ์ด์ฒ˜๋Ÿผ activity์—์„œ ๋ทฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์ค€๋‹ค
๊ณผ์ œ ) ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ
Intent - ์š”๊ตฌ , ์˜์‚ฌ์ „๋‹ฌ , ์š”์ฒญ
 ์š”์ฒญ ๊ด€๊ณ„ -
1. activity  activity ๊ฐ€ intent๋ฅผ ํ†ตํ•ด์„œ 
์ฃผ๊ณ  ๋ฐ›์Œ, 
2.android system ๊ณผ ๋‚ด app (์ „ํ™”,๋ฉ”์‹œ์ง€ ๋“ฑ๋“ฑ) , 
3.๋‹ค๋ฅธ app ๊ณผ ๋‚ด app (๊ฒฐ์ œ ๋“ฑ๋“ฑ) ->์ƒํ˜ธํ•ฉ์˜ ํ•„์š”
์š”์ฒญ์˜ ์ข…๋ฅ˜ -
1,์ „๋‹ฌ๋งŒ ํ•˜๋Š” ์š”์ฒญ startActivity
2. ๋ฆฌํ„ด์„ ๋ฐ›๋Š” ์š”์ฒญ startActivityForResult
---------------Intent ์‹ค์Šต -----------------------
์ „๋‹ฌ ๋งŒ ํ•˜๋Š” ์š”์ฒญ
Activity ๋ฅผ ๋‘๊ฐœ ๋งŒ๋“ค์–ด์คŒ (intent1 , intent2)
Intent 1 activity ๊ฐ€ intent2 ์— ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ
ํ™”๋ฉด์ „ํ™˜
change_activity.setOnClickListener{
	Val a=Intent(this@intent,intent2::class.java)
	a.putExtra("number1",1)
	a.putExtra("number2",2)
	startActivity(a)
}
Val intent2=Intent(this@intent,intent2::class.java)
intent2.apply{  -apply๋ฅผ ํ™œ์šฉํ•ด์„œ ํ•˜๋ฉด ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜ ํ• ๋•Œ ์ข‹์Œ.
	this.putExtra('asdasd',1)


}
startActivity(intent2)

putExtra ๋ž€ key,value ๋ฐฉ์‹์œผ๋กœ ์Œ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ
๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ ๋ณด๋‚ด์คฌ์œผ๋‹ˆ๊นŒ ์ด์ œ intent2 ๋กœ ๊ฐ€์„œ ๋ฐ›์€ ๊ฑธ ๊บผ๋‚ด์ค˜์•ผํ•จ
//intent2.kt
setContentView(R.layout.activity_intent2)
valnumber1=intent.getIntExtra("number1",0)
valnumber2=intent.getIntExtra("number2",0)
Log.d("number",""+number1)
์—ฌ๊ธฐ์„œ intent ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์ž„
Intent ์—์„œ a ๋ณ€์ˆ˜๊ฐ€ ๋ณด๋‚ด์ค€ putExtra๋ฅผ intent2 ํŒŒ์ผ์—์„œ intent ํ•จ์ˆ˜.getIntExtra ๋ฅผ ํ†ตํ•ด ๋ฐ›์€๊ฒƒ
๋ฆฌํ„ด์„ ๋ฐ›๋Š” ์š”์ฒญ startActivityForResult
//intent2.kt
result.setOnClickListener{
valnumber1=intent.getIntExtra("number",1)
valresultInt=Intent()
resultInt.putExtra("result",number1)
setResult(Activity.RESULT_OK,resultInt)
finish()//activity์ข…๋ฃŒ
//intent1.kt
startActivityForResult(intent2,200)
overridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent?){
if(requestCode==200){
	Log.d("number",""+requestCode)
	Log.d("number",""+resultCode)
	data?.getIntExtra("result",0)
	Log.d("number",""+resultInt)
	
}
super.onActivityResult(requestCode,resultCode,data)
}
์—ฌ๊ธฐ์„œ resultCode๋Š” intent2์—์„œ ๋ณด๋‚ธ RESULT_OK
Data๋Š” resultint ๊ฐ€ ๋˜๋Š”๊ฒƒ
์ธํ…ํŠธ์˜ ์ข…๋ฅ˜ 
- ๋ช…์‹œ์  ์ธํ…ํŠธ -์œ„์—์„œ ํ–ˆ๋˜ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š” ์ธํ…ํŠธ๋“ค
- ์•”์‹œ์  ์ธํ…ํŠธ - naver๋กœ ์ด๋™์‹œ์ผœ์คŒ  ex) ๋ฐฐ๋‹ฌ์•ฑ์—์„œ ์ „ํ™” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ „ํ™” ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œ์ผœ์ฃผ๋Š” ๋“ฑ
change_activity.setOnClickListener{
Val intent2=Intent(Intent.ACTION_VIEW,Uri.parse("http://m.naver.com"))
startActivity(intent2)
}
Task- activity๊ฐ€ ์•„๋ž˜์—์„œ ์œ„๋กœ ์Œ“์ด๋Š” ๊ฒƒ  
์ผœ์ง€๋Š” ๋ฐฉ๋ฒ•์„ ์ž์ฒด ์†์„ฑ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์ž‡๋Š” ๊ฒฝ์šฐ
-> launchMode
์ผœ์ง€๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์‹œํ•˜๋Š” ๊ฒฝ์šฐ
->IntentFlag
LaunchMode                   ๋‹ค์ค‘ํ—ˆ์šฉ
	-standard                       0
	-singleTop                      ์กฐ๊ฑด๋ถ€ ->์—ด๋ ค๊ณ  ํ•˜๋Š” ์—‘ํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ํ˜„์žฌ ์—‘ํ‹ฐ๋น„ํ‹ฐ๋ผ๋ฉด onNewIntent ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค
	----------------------------------------------------------
	-singleTask                       x
	-SingleInstance                 x
์ธํ…ํŠธ ํ”Œ๋ž˜๊ทธ
	-FLAG_ACTIVITY_NEW_TASK
	-FLAG_ACTIVITY_SINGLE_TOP
	-FLAG_ACTIVITY_CLEAR_TOP
๋Ÿฐ์น˜๋ชจ๋“œ๋‚˜ ์ธํ…ํŠธ ํ”Œ๋ ˆ๊ทธ๋ฅผ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชจ๋ฅธ์ฑ„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ์ด ๊ผฌ์—ฌ๋ฒ„๋ฆฌ๋ฏ€๋กœ ๊ทธ๋ƒฅ ๋‚˜๋‘๋Š”๊ฒŒ ๋‚ซ๋‹ค
open.setOnClickListener{
	valaddress=address_edit_text.text.toString()
	valintent=Intent(Intent.ACTION_VIEW,Uri.parse(address))
	startActivity(intent)
}
//์—ฌ๊ธฐ์„œ open ์ด๋ž‘ address_edit_text ๋Š” id์ด๋ฆ„
์›ํ•˜๋Š” text๋ฅผ ์ž…๋ ฅํ–ˆ์„๋•Œ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ 
์›ํ•˜์ง€ ์•Š๋Š” text๋ฅผ ์ž…๋ ฅํ–ˆ์„๋•Œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ
address_edit_text.addTextChangedListener(object:TextWatcher{
	overridefunafterTextChanged(s:Editable?){
		TODO("Notyetimplemented")
		Log.d("aa",""+s) //s ๋Š” ์ž…๋ ฅ๊ฐ’
	}

	overridefunbeforeTextChanged(s:CharSequence?,start:Int,count:Int,after:Int){
		TODO("Notyetimplemented")
	}
	
	overridefunonTextChanged(s:CharSequence?,start:Int,before:Int,count:Int){
		TODO("Notyetimplemented")
	}
})
	
Fragment - 
	- Activity -> ์•ฑ์— ๋ณด์ด๋Š” ํ•œ ํ™”๋ฉด์˜ ๋‹จ์œ„
	- Activity  ํ•˜๋‚˜๊ฐ€ ์—„์ฒญ ๊ธธ๋•Œ ํŒŒํŠธ 1,2,3,4,5,6, ์ด๋Ÿฐ ์‹์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค๊ณ  ํ–‡์„๋•Œ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง ->๊ด€๋ฆฌํฌ์ธํŠธ๊ฐ€ ๋งŽ์•„์ง„๋‹ค.
	- ์•ˆ๋“œ๋กœ์ด๋“œ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋„ˆ๋ฌด ๋‹ค์–‘ํ•˜๋‹ค
	- ์•ˆ๋“œ๋กœ์ด๋“œ์—๋Š” ํ•ธ๋“œํฐ๋งŒ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค!->ํƒœ๋ธ”๋ฆฟ์ด ์žˆ๋‹ค.
์‚ฌ์šฉ์ฒ˜ - ์—‘ํ‹ฐ๋น„ํ‹ฐ์˜ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ์ฑ…์ž„์ง„๋‹ค
-๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค
-์—‘ํ‹ฐ๋น„ํ‹ฐ ์ข…์†์ ์ด๋‹ค.
-------- Fragment ์‹ค์Šต -----------------
์ผ๋‹จ ๊ฐœ๋…์ ์œผ๋กœ layout ํ•˜๋‚˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ๊ทธ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ๊ฐœ์˜ fragment ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป.
์ฆ‰ Home.kt  ์™€ activity_home.xml ์•ˆ์— Section.kt์™€ activity_Section.xml ์ด ํ•„์š”ํ•จ
Activity_home.xml ์•ˆ์—  fragment ํƒœ๊ทธ๋ฅผ ์”€
<fragment
android:id="@+id/section"
android:name="com.example.myapplication.section"
android:layout_width="match_parent"
android:layout_height="300dp"/>

์—ฌ๊ธฐ์„œ name ์ด๋ž‘ id๋Š” ํ•„์ˆ˜ ๊ฐ’์ž„.
Activity_section.xml ์—์„œ๋Š” ๋ ˆ์ด์•„์›ƒ ์žก์•„์ฃผ๊ณ 
Section.kt ์—์„œ
overridefunonCreateView(//์ด์นœ๊ตฌ๊ฐ€๋ทฐ๋ฅผ๊ทธ๋ฆฌ๋Š”์นœ๊ตฌ
	inflater:LayoutInflater,
	container:ViewGroup?,
	savedInstanceState:Bundle?
):View?{
//ํ”„๋ผ๊ทธ๋จผํŠธ๊ฐ€์ธํ„ฐํŽ˜์ด์Šค๋ฅผ์ฒ˜์Œ์œผ๋กœ๊ทธ๋ฆด๋•Œํ˜ธ์ถœ๋œ๋‹ค.
//inflater=>๋ทฐ๋ฅผ๊ทธ๋ ค์ฃผ๋Š”์—ญํ™œ
//container=>๋ถ€๋ชจ๋ทฐ
	returninflater.inflate(R.layout.Section,container,false)

}
์ „์ฒด LifeCycle ๊ทธ๋ ค๋ณด๋ฉด


 
Class section:Home(){ //home์„ ์ƒ์†
Overridefun onAttach(context:Context?){
Log.d("lifecycle","onAttach")
super.onAttach(context)
}

Overridefun onCreate(savedInstanceState:Bundle?){
Log.d("lifecycle","onCreate")
super.onCreate(savedInstanceState)
}

Overridefun onCreateView(//์ด์นœ๊ตฌ๊ฐ€๋ทฐ๋ฅผ๊ทธ๋ฆฌ๋Š”์นœ๊ตฌ
inflater:LayoutInflater,
container:ViewGroup?,
savedInstanceState:Bundle?
):View?{
//ํ”„๋ผ๊ทธ๋จผํŠธ๊ฐ€์ธํ„ฐํŽ˜์ด์Šค๋ฅผ์ฒ˜์Œ์œผ๋กœ๊ทธ๋ฆด๋•Œํ˜ธ์ถœ๋œ๋‹ค.
//inflater=>๋ทฐ๋ฅผ๊ทธ๋ ค์ฃผ๋Š”์—ญํ™œ
//container=>๋ถ€๋ชจ๋ทฐ
returninflater.inflate(R.layout.section,container,false)

}

Overridefun onViewCreated(view:View,savedInstanceState:Bundle?){
Log.d("lifecycle","onViewCreated")
super.onViewCreated(view,savedInstanceState)
}

Overridefun onActivityCreated(savedInstanceState:Bundle?){
Log.d("lifecycle","onActivityCreated")
super.onActivityCreated(savedInstanceState)
}

Overridefun onStart(){
Log.d("lifecycle","onStart")
super.onStart()
}

Overridefun onResume(){
Log.d("lifecycle","onResume")
super.onResume()
}

Overridefun onPause(){
Log.d("lifecycle","onPause")
super.onPause()
}

Overridefun onStop(){
Log.d("lifecycle","onStop")
super.onStop()
}

-
Overridefun onDestroyView(){
Log.d("lifecycle","onDestroyView")
super.onDestroyView()
}

Overridefun onDetach(){
Log.d("lifecycle","onDetach")
super.onDetach()
}
}
Fragment ๋™์ ์œผ๋กœ ๋งŒ๋“œ๋Š”๋ฒ• !@!

 
overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_fragment)
valfragmentOne:FragmentOne=FragmentOne()
//ํ”„๋ผ๊ทธ๋จผํŠธ์—data๋ฅผ๋„ฃ์–ด์ฃผ๋Š”๋ฐฉ๋ฒ•๋ฒˆ๋“ค์„๋งŒ๋“ค์–ด์„œ๊ทธ๋ฒˆ๋“ค์—๋ผ์–ด๋„ฃ์–ด์ค˜์•ผํ•จ
valbundle:Bundle=Bundle()
bundle.putString("hello","hello")
- fragmentOne.arguments=bundle //FragmentOne.ktํŒŒ์ผ์— onActivitycreated ๋ฉ”์†Œ๋“œ์—์„œ  ์ž‘์—…ํ•ด์ค€๋‹ค
๋ณด๋ฉด//FragmentOne.kt
Override fun onActivityCreated(savedInstanceState:Bundle ?) {
	Val data = argument?.getString("hello")
	Log.d("data",data)
}

button.setOnClickListener{
	//ํ”„๋ผ๊ทธ๋จผํŠธ๋ฅผ๋™์ ์œผ๋กœ์ž‘๋™ํ•˜๋Š”๋ฐฉ๋ฒ•
	๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ”„๋ผ๊ทธ๋จผํŠธ๊ฐ€ replace
	
	valfragmentManager:FragmentManager=supportFragmentManager
	//transaction
	//์ž‘์—…์˜๋‹จ์œ„=>์‹œ์ž‘๊ณผ๋์ด์žˆ๋‹ค
	valfragmentTransaction=fragmentManager.beginTransaction()//์‹œ์ž‘
	fragmentTransaction.replace(R.id.container,fragmentOne)//ํ• ์ผ์ ์–ด์ฃผ๊ณ 
	//๋์„๋‚ด๋Š”๋ฐฉ๋ฒ•์€commit๊ณผcommitnow๊ฐ€์žˆ์Œ
	//commit->์‹œ๊ฐ„๋ ๋•Œ์ปค๋ฐ‹ํ•ด(์ข€๋”์•ˆ์ •์ )
	//commitnow=>์ง€๊ธˆ๋‹น์žฅํ•ด
	fragmentTransaction.commit()
	
	}
	button2.setOnClickListener{
	//ํ”„๋ผ๊ทธ๋จผํŠธremove/detachํ•˜๋Š”๋ฐฉ๋ฒ•
	valfragmentManager=supportFragmentManager
	valfragmentTransition=fragmentManager.beginTransaction()
	fragmentTransition.detach(fragmentOne)
	fragmentTransition.commit()
}
}
NullPointException - ๊ต‰์žฅํžˆ ์ž์ฃผ๋‚˜๋Š” ์—๋Ÿฌ
ํ˜„์žฌ์ƒํ™ฉ - <Linear>
					<fragment> --- fragmentOne
					<Linear>-----fragment ์—์„œ ๋งŒ๋“ค์–ด์คŒ
์ฆ‰, ์šฐ๋ฆฌ๋Š” bundle  ํ†ตํ•ด Linear ๋ฐ‘์— ๋ถ€๋ถ„์—์„œ fragment๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ fragmentOne์œผ๋กœ ๋„˜๊ฒจ์คฌ๋Š”๋ฐ ๋ง‰์ƒ ์•ฑ์„ ์‹œ์ž‘ํ• ๋•Œ๋Š” fragment ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๋ฏ€๋กœ data๊ฐ€ null์ด ๋จ ๊ฒฐ๋ก ์€ onActivityCreated ๋Š” button์„ ๋ˆ„๋ฅผ๋•Œ ์‹คํ–‰ ๋˜๊ฒŒ๋” ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ํ˜„์žฌ fragment ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ๋•Œ๋„ ์‹คํ–‰๋œ๋‹ค๋Š” ๋œป. 
๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•
์ธํ…ํŠธ๋Š” activity  ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ณต์œ ํ•˜๊ณ  onActivityResult ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜์ง€๋งŒ  ์—ฌ๊ธฐ์„  ๋ณด๋‚ด๋Š” ๊ฑด bundle ๊ณผ argument ๋ฅผ ์ด์šฉํ•˜์ง€๋งŒ ๋Œ์•„์˜ค๋Š”๊ฑฐ๋Š” ์ž์ฒด๊ตฌํ˜„ํ•ด์•ผํ•จ
	-activity -> Fragment ๋Š” argument์™€ bundle ์ด์šฉ
	- Fragment -> activity ๋Š” ์ž์ฒด๊ตฌํ˜„ํ•ด์•ผํ•จ(๋ฆฌ์Šค๋„ˆ ๊ตฌํ˜„)
	- //FragmentOne.kt
	classFragmentOne:Fragment(){
	//๋ฐ์ดํ„ฐ๋ฅผactivity๋ฅผ๋ณด๋‚ผ๋•Œ์‚ฌ์šฉํ•˜๋Š”interface
	interfaceOnDataPassListener{//๋ฆฌ์Šค๋„ˆ๋งŒ๋“ค๋•Œ๋Š”์ธํ„ฐํŽ˜์ด์Šค(์ƒ์„ฑ์ž์—†์Œ)
		funonDataPass(data:String?)//์ŠคํŠธ๋งํƒ€์ž…์œผ๋กœ๊ฐ€์ƒํ•จ์ˆ˜ํ•˜๋‚˜๋งŒ๋“ค์–ด์คŒ
	}
	lateinitvardataPassListener:OnDataPassListener//์ธํ„ฐํŽ˜์ด์Šคํƒ€์ž…์ธ๋ณ€์ˆ˜์„ ์–ธ
	//lateinit์ด๋ž€๋‚˜์ค‘์—์ดˆ๊ธฐํ™”ํ•˜๊ฒ ๋‹ค๋Š”์˜๋ฏธvar์ผ๋•Œ๋งŒ๊ฐ€๋Šฅํ•˜๋‹ค.
	overridefunonAttach(context:Context?){
	Log.d("lifecycle","onAttach")
	super.onAttach(context)
	dataPassListener=contextasOnDataPassListener//ํ˜•๋ณ€ํ™˜์„ํ•ด์คŒ
	}
	
	overridefunonCreate(savedInstanceState:Bundle?){
	Log.d("lifecycle","onCreate")
	super.onCreate(savedInstanceState)
	}
	//์ •์ ์œผ๋กœ๋ทฐ๋ฅผ๊ทธ๋ฆด๋•Œ์‚ฌ์šฉ
	overridefunonCreateView(//์ด์นœ๊ตฌ๊ฐ€๋ทฐ๋ฅผ๊ทธ๋ฆฌ๋Š”์นœ๊ตฌ
	inflater:LayoutInflater,
	container:ViewGroup?,
	savedInstanceState:Bundle?
	):View?{
	//ํ”„๋ผ๊ทธ๋จผํŠธ๊ฐ€์ธํ„ฐํŽ˜์ด์Šค๋ฅผ์ฒ˜์Œ์œผ๋กœ๊ทธ๋ฆด๋•Œํ˜ธ์ถœ๋œ๋‹ค.
	//inflater=>๋ทฐ๋ฅผ๊ทธ๋ ค์ฃผ๋Š”์—ญํ™œ
	//container=>๋ถ€๋ชจ๋ทฐ
	returninflater.inflate(R.layout.fragment_one,container,false)
	
	}
	//interfaceํ•จ์ˆ˜๋กœ๋ฐ์ดํ„ฐ๋ฅผactivity๋กœ๋ณด๋‚ด์ฃผ๋Š”๋กœ์ง
	overridefunonViewCreated(view:View,savedInstanceState:Bundle?){
	Log.d("lifecycle","onViewCreated")
	super.onViewCreated(view,savedInstanceState)
	//activity์˜onCreate์—์„œํ–ˆ๋˜์ž‘์—…์„fragment๋Š”์—ฌ๊ธฐ์—์„œํ•œ๋‹ค.
	//fragment๋ฅผํ†ตํ•ด์„œํ•˜๊ณ ์‹ถ์€์ž‘์—…์„์ด๊ณณ์—์œ„์น˜์‹œ์ผœ์ค˜์•ผํ•จ
	pass.setOnClickListener{//๋ฆฌ์Šคํ„ฐ๋กœ๋ฐ์ดํ„ฐ๋ฅผ๋ณด๋ƒ„๊ทธ๋Ÿผ๋‹ค์‹œ๋ฆฌ์Šค๋„ˆ๊ฐ€๋ฐ์ดํ„ฐ๋ฅผ๋ฐ›์•„์ค˜์•ผํ•จ
	//์–ด๋””?activity์—์„œ๋ฐ›์•„์ค˜์•ผํ•จ
	dataPassListener.onDataPass("goodbye")
	}
	}
	//bundle์„ํ†ตํ•ด๋ฐ์ดํ„ฐ๋ฅผ๋ฐ›์•˜์„๋•์—ฌ๊ธฐ์„œ๋ฐ›๋Š”๊ฒƒ
	overridefunonActivityCreated(savedInstanceState:Bundle?){
	Log.d("lifecycle","onActivityCreated")
	valdata=arguments?.getString("hello")
	Log.d("data",data)
	super.onActivityCreated(savedInstanceState)
	}
	
	overridefunonStart(){
	Log.d("lifecycle","onStart")
	super.onStart()
	}
	
	overridefunonResume(){
	Log.d("lifecycle","onResume")
	super.onResume()
	}
	
	overridefunonPause(){
	Log.d("lifecycle","onPause")
	super.onPause()
	}
	
	overridefunonStop(){
	Log.d("lifecycle","onStop")
	super.onStop()
	}
	
	
	overridefunonDestroyView(){
	Log.d("lifecycle","onDestroyView")
	super.onDestroyView()
	}
	
	overridefunonDetach(){
	Log.d("lifecycle","onDetach")
	super.onDetach()
	}
	}
	//Fragment
	
	classFragmentActivity:AppCompatActivity(),FragmentOne.OnDataPassListener{
	overridefunonDataPass(data:String?){//์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์คŒ
	Log.d("pass",""+data)
	}
	
	overridefunonCreate(savedInstanceState:Bundle?){
	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_fragment)
	valfragmentOne:FragmentOne=FragmentOne()
	//ํ”„๋ผ๊ทธ๋จผํŠธ์—data๋ฅผ๋„ฃ์–ด์ฃผ๋Š”๋ฐฉ๋ฒ•๋ฒˆ๋“ค์„๋งŒ๋“ค์–ด์„œ๊ทธ๋ฒˆ๋“ค์—๋ผ์–ด๋„ฃ์–ด์ค˜์•ผํ•จ
	valbundle:Bundle=Bundle()
	bundle.putString("hello","hello")
	fragmentOne.arguments=bundle
	button.setOnClickListener{
	//ํ”„๋ผ๊ทธ๋จผํŠธ๋ฅผ๋™์ ์œผ๋กœ์ž‘๋™ํ•˜๋Š”๋ฐฉ๋ฒ•
	
	valfragmentManager:FragmentManager=supportFragmentManager
	//transaction
	//์ž‘์—…์˜๋‹จ์œ„=>์‹œ์ž‘๊ณผ๋์ด์žˆ๋‹ค
	valfragmentTransaction=fragmentManager.beginTransaction()//์‹œ์ž‘
	fragmentTransaction.replace(R.id.container,fragmentOne)//ํ• ์ผ์ ์–ด์ฃผ๊ณ 
	//๋์„๋‚ด๋Š”๋ฐฉ๋ฒ•์€commit๊ณผcommitnow๊ฐ€์žˆ์Œ
	//commit->์‹œ๊ฐ„๋ ๋•Œ์ปค๋ฐ‹ํ•ด(์ข€๋”์•ˆ์ •์ )
	//commitnow=>์ง€๊ธˆ๋‹น์žฅํ•ด
	fragmentTransaction.commit()
	
	}
	button2.setOnClickListener{
	//ํ”„๋ผ๊ทธ๋จผํŠธremove/detachํ•˜๋Š”๋ฐฉ๋ฒ•
	valfragmentManager=supportFragmentManager
	valfragmentTransition=fragmentManager.beginTransaction()
	fragmentTransition.detach(fragmentOne)
	fragmentTransition.commit()
	}
	}
	

	6/01
	Null Safety -> null์—๋Œ€ํ•ด์„œ ์•ˆ์ „ํ•˜๋‹ค = ์ฝ”ํ‹€๋ฆฐํŠน์ง•
	์ฝ”ํ‹€๋ฆฐ์ด  nullSafety ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•
	-> ?
	->!!
	Number?.~~~~~~ = ์•ž์—์žˆ๋Š”๊ฒŒ ๋„์ด์•„๋‹ˆ๋ผ๋ฉด ๋’ค์—์žˆ๋Š”๊ฑธ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค
	Number!!.~~~~~~~~ = ์ด๊ฑด ํ™•์‹คํžˆ ๋„์ด ์•„๋‹˜์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ !(์ตœ๋Œ€ํ•œ ์‚ฌ์šฉ x)
	์‚ผํ•ญ์—ฐ์‚ฐ์ž -> ์—˜๋น„์Šค ์—ฐ์‚ฐ์ž
	Val number2 = number1 ?:10   = number1์ด ๋„์ด์•„๋‹ˆ๋ฉด number1 ์ด ๋“ค์–ด๊ฐ€๊ณ  ๋„์ด๋ฉด 10์ด ๋“ค์–ด๊ฐ
	Lateinit ->์ดˆ๊ธฐ๊ฐ’์„ ๋‚˜์ค‘์— ์„ธํŒ…ํ•ด์ฃผ๊ฒ ๋‹ค
		-> ์ดˆ๊ธฐ๊ฐ’์ด ์„ธํŒ… ๋˜์ง€ ์•Š์•˜์„๋•Œ ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ
	res/Resource
	Colors.xml -> ์—ฌ๊ธฐ์„œ ์ƒ‰์ƒ ์„ค์ • ํ•˜๋ฉด ํŽธํ•จ
	Strings.xml => ์—ฌ๊ธฐ์„œ ๋ฐ˜๋ณต๋˜๋Š” ๊ธ€์ž ์„ค์ •ํ•˜๋ฉด ํŽธํ•จ
	Styles.xml -> ์–ดํ”Œ ํ…Œ๋งˆ์ •ํ•ด์คŒ
	<item name="windowNoTitle">true</itme> ->  ใ…ฃํ‹€ ์—†์–ด์ง
	Resource๋ผ๋Š” ์—‘ํ‹ฐ๋น„ํ‹ฐ ๋งŒ๋“ค์–ด์คŒ
	<resource์— ์žˆ๋Š” string๊ฐ’์„ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๋„˜๊ฒจ์ค„๊ฒƒ>
			//1๋ฒˆ๋ฐฉ๋ฒ•
			valment=resources.getString(R.string.hello)
			//2๋ฒˆ๋ฐฉ๋ฒ•
			valment2=getString(R.string.hello)
			}
	<color ๊ฐ’๋„ ๋˜‘๊ฐ™์ด ํ•˜๋ฉด ๋จ>
	valcolor=getColor(R.color.colorAccent) 
	<์—‘ํ‹ฐ๋น„ํ‹ฐ background ์ปฌ๋Ÿฌ ๋ฐ”๊พธ๋Š”๋ฒ•>
	button.setBackgroundColor(getColor(R.color.colorPrimaryDark))
	Context
	์—ญํ•  -> ActivityManagerService(๊ฐœ๋ฐœํ•˜๊ธฐ ํŽธํ•˜๋„๋ก ๋ฏธ๋ฆฌ ๊ตฌํ˜„ ํ•ด๋†“์€ ๊ธฐ๋Šฅ)์— ์ ‘๊ทผ ํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ์—ญํ• 	
	์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ์ด๋ฏธ ๋งŽ์€๋ถ€๋ถ„๋“ค์ด ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค->์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Context๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
	classResource:AppCompatActivity()
	์—ฌ๊ธฐappconpatactivity ์—์„œ ๋งŽ์€๊ฒƒ๋“ค์„ ์ƒ์†๋ฐ›์•„ ์“ฐ๊ณ ์žˆ์Œ.
	์ข…๋ฅ˜ -> 
	 activity์˜ context , -> Activity ์˜ ์ฃผ๋ณ€์ •๋ณด
	 application ์˜ context -> Application์˜ ์ฃผ๋ณ€์ •๋ณด
	ApplicationContext > ActivityContext 
	
	Thread(์“ฐ๋ ˆ๋“œ)
	-์ž‘์—… ํ๋ฆ„
	์•ˆ๋“œ๋กœ์ด๋“œ์˜ ์“ฐ๋ ˆ๋“œ
	->MainThread (์ค‘์‹ฌ์ด ๋˜๋Š” Thread)
	------------------------------>
		->launcher Activity
						-> Activity B
							->๊ธฐํƒ€ ๋“ฑ๋“ฑ
	ใ…กMainThread ๋งŒ ์žˆ๋Š”๊ฒฝ์šฐ
	---------------------------------------------->
	->๋”ํ•˜๊ธฐ->๋นผ๊ธฐ -> ๊ณฑํ•˜๊ธฐ -> ๋‚˜๋ˆ„๊ธฐ
	๋‹ค๋ฅธ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ = ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ผ์„ ํ•œ๋ฒˆ์— ํ•  ์ˆ˜ ์žˆ์Œ
	----------------------------------------------->
		->๋นผ๊ธฐ
			------------>๊ณฑํ•˜๊ธฐ
				->๋”ํ•˜๊ธฐ
		->๋‚˜๋ˆ„๊ธฐ
	ํŠน์ง•
	-UI  Thread  
		-์‚ฌ์šฉ์ž์˜ input์„ ๋ฐ›๋Š” ์“ฐ๋ ˆ๋“œ
	-์ ˆ๋Œ€ ์ •์ง€์‹œํ‚ฌ์ˆ˜ ์—†๋‹ค !!!!(ํ•˜๋ฉด ์•ˆ๋จ)
		-์™œ๋ƒ๋ฉด ์‚ฌ์šฉ์ž์˜  input์„ ๋ฐ›์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ
	 
	//์“ฐ๋ ˆ๋“œ์—์„œํ•˜๊ณ ์‹ถ์€์ผ์ด์žˆ๊ธฐ๋•Œ๋ฌธ์—๋งŒ๋“ฌ
	//ํ•˜๊ณ ์‹ถ์€์ผ์„runnable์ด๋ผ๋Š”์นœ๊ตฌ๋ฅผ๋งŒ๋“ค์–ด์„œthread๋ฅผrunaalbe์—๋„ฃ์–ด์คŒ
	valrunnable:Runnable=object:Runnable{//์ธํ„ฐํŽ˜์ด์Šค๋ฅผ๊ตฌํ˜„ํ• ๋•Œobject์”€
		overridefunrun(){
			Log.d("aaa","Threadgood")
		}
	}
	valthread:Thread=Thread(runnable)
	button.setOnClickListener{//๋ฒ„ํŠผ์„๋ˆ„๋ฅด๋ฉดthread๊ฐ€์‹œ์ž‘๋˜๊ฒŒ๋”ํ•จ
		thread.start()//์ด๋ถ€๋ถ„์„์ž‘์„ฑํ•ด์•ผ์‹œ์ž‘์ด๋จ.
	
	}
	์“ฐ๋ ˆ๋“œ๋Š” ๋งŒ๋“ค์ž ๋งˆ์ž ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ ----
	Thread(object:Runnable{
		overridefunrun(){
			TODO("Notyetimplemented")
			Thread.sleep(2000) //2์ดˆ ์‰ผ
		}
	
	}).start()
	์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ์ผ์€ ์—†๋‹ค
	
	Framework
	-์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค
	-๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ์œ„ํ•ด ์ง€์ผœ์•ผํ•˜๋Š” 
	
	Library(์™ธ๋ถ€์˜ ๋„์›€)
	-๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์ด ๋ฏธ๋ฆฌ ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ
	-ํ•จ์ˆ˜๋‚˜, ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ์Œ
	๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹ค์Šต------
	Glide ์„ค์น˜ - ์ด๋ฏธ์ง€ ์‚ฌ์šฉ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์คŒ.
	Build.gradle ์—์„œ repositories ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„ฃ์–ด์คŒ
	์‹คํ–‰์‹œ์ผœ๋ณด๋‹ˆ ์˜ค๋ฅ˜ ๋‚จ -> missing INTERNET permission
	์ธํ„ฐ๋„ท ์‚ฌ์šฉ ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ๋œป.
	ํ•ด๊ฒฐ -> manifests ์—์„œ application   ์œ„์—
	<uses-permission android:name="android.permission.INTERNET"/>
	์— 
	๋ฆฌ์ŠคํŠธ ๋ทฐ
	-์œ ์‚ฌํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ
	๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•
	1. Addview
		i. -> ์‹ค์ œ๋กœ ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
		ii. ->Item์„ ๋‹ด์„ xml์„ ๋งŒ๋“ค์–ด์คŒ
		iii. ->๊ทธ xml์— ๋‚ด์šฉ์„ ์ฑ„์›Œ์ค€๋‹ค
		iv. -> container view์— ๋”ํ•ด์ค€๋‹ค
		v. -> ๋ฐ˜๋ณตํ•œ๋‹ค.
	2. Listview 
		i. -> ์˜ˆ์ „์— ๋งŽ์ด ์‚ฌ์šฉ
	3. RecycleView -> ์ตœ๊ทผ์— ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ ์žˆ๊ณ  ํšจ์œจ์ด ๋†’์Œ
	ใ…
	Addview ์‹ค์Šต
	์•กํ‹ฐ๋น„ํ‹ฐ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  
ID ๊ฐ€์ ธ์˜ค๋Š” ๋ฒ•
Val ~~~  = findViewById<LinearLayout๋“ฑ๋“ฑ>(R.id.์•„๋””์ด๋ฆ„)
2, ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์— ์žˆ๋Š” Id ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฒ•
Var inflater = LayoutInflater.from(this@๋ถ€๋ชจ๋ ˆ์ด์•„์›ƒ์ด๋ฆ„) // @ ๋ ˆ์ด์•„์›ƒ์ด๋ฆ„ ์œผ๋กœ๋ถ€ํ„ฐ Layout์„ ๊ฐ€์ ธ์˜ด

 val itemView = inflater.inflate(R.layout.๋ ˆ์ด์•„์›ƒ์ด๋ฆ„,null) //์ด ๋ ˆ์ด์•„์›ƒ์„ inflater์— ๊ฐ€์ ธ์˜ด 
itemView.findViewById<~~~>(R.Id.~~~)
์š”์•ฝ
val inflater = LayoutInflater.from(context)
...
val view = inflater.inflate(R.layout.my_view, parent, false)
parent.addView(view)
...
inflater.inflate(R.layout.my_view, parent, true)
...
View.inflate(context, R.layout.my_view, parent)
	โ€ข XML๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์—์„œ ๋ทฐ๋ฅผ ์ƒ์„ฑํ• ๋•Œ๋Š” LayoutInflater๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ถœ์ฒ˜: <https://medium.com/vingle-tech-blog/android-layoutinflater-b6e44c265408> 




classAddViewActivity:AppCompatActivity(){

overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_view)
//์•„์ดํ…œ๋ฆฌ์ŠคํŠธ์ค€๋น„
valcarList=ArrayList<CarforList>()
for(iin0until10){//๋ฐ˜๋ณต๋ ๋ ˆ์ด์•„์›ƒ์„์…‹ํŒ…ํ•ด์คŒ.
	carList.add(CarforList(""+i+"๋ฒˆ์งธ์ž๋™์ฐจ"))
}
valcontainer=findViewById<LinearLayout>(R.id.addViewContainer)
valinflater=LayoutInflater.from(this@AddViewActivity)
for(iin0untilcarList.size){//์ด๋ ˆ์ด์•„์›ƒ์ด๋งŒ๋“ค์–ด์ง€๋ฉด์„œ๋ฐ˜๋ณต๋จ.
	valitemView=inflater.inflate(R.layout.item_view,container)
	valcarNameView=itemView.findViewById<TextView>(R.id.car_name)
	carNameView.setText(carList.get(i).name)
	container.addView(itemView)
}
}

}
classCarforList(valname:String,valengine:String){

}

6/01 classPhoneCall:AppCompatActivity(){

overridefunonCreate(savedInstanceState:Bundle?){
	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_phone_call)
	valphonebook=createFakePhoneBook()
	createPhoneBookList(phonebook)

}
	funcreateFakePhoneBook(fakeNumber:Int=10,phonebook:PhoneBook=PhoneBook()):PhoneBook{//phonebook์„์ธ์ž๋กœ๋ฐ›๋Š”๋ฐ
	//๋„ฃ์–ด์ฃผ์ง€์•Š์œผ๋ฉด๊ธฐ๋ณธ๊ฐ’์œผ๋กœ์ƒ์„ฑํ•˜๊ฒ ๋‹ค๋ผ๋Š”์˜๋ฏธ,fakeNumber๋„๊ธฐ๋ณธ๊ฐ’10๋ช…
	//๋’ค์—:PhoneBook์€PhoneBook์„๋ฆฌํ„ด์‹œํ‚ค๊ฒ ๋‹ค๋Š”์˜๋ฏธ
	for(iin0untilfakeNumber){
		phonebook.addPerson(
			Person(
				name=""+i+"๋ฒˆ์งธ์‚ฌ๋žŒ",
				number=""+i+"๋ฒˆ์งธ์‚ฌ๋žŒ์˜์ „ํ™”๋ฒˆํ˜ธ"
		)
	)
	}
	returnphonebook
}
funcreatePhoneBookList(phonebook:PhoneBook){
	vallayoutInflater=LayoutInflater.from(this@PhoneCall)
	valcontainer=findViewById<LinearLayout>(R.id.PhoneContainer)
	for(iin0untilphonebook.personList.size){
		valview=layoutInflater.inflate(R.layout.phonename_view)
		valviewOne=view.findViewById(R.id.number)
		viewOne.setText(phonebook.personList.get(i).name)
		container.addView(viewOne)//์ปจํ…Œ์ด๋„ˆ์—๋ทฐํ•˜๋‚˜๋ฅผ์ž…ํž˜
	}

}


classPhoneBook(){
//์ „ํ™”๋ฒˆํ˜ธ๋ถ€
	valpersonList=ArrayList<Person>()
	funaddPerson(person:Person){
		personList.add(person)
}

}
classPerson(valname:String,varnumber:String){

}

์—ฌ๊ธฐ์„œ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ „ํ™”๋ฒˆํ˜ธ๋ถ€ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ํ•œ๋‹ค.
Val intent = Intent(this@~~~,~~~::class.java)
Intent.putExtra(~~~~~~~~)
startActivity(intent)

Addview

1.๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ์•„์ดํ…œ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•œ๋‹ค 2.์ธํ”Œ๋ ˆ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•œ๋‹ค 3.์ธํ”Œ๋ ˆ์ดํ„ฐ๋กœ ์•„์ดํ…œ ํ•˜๋‚˜์— ํ•ด๋‹นํ•˜๋Š” ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค 4.์œ„์—์„œ ๋งŒ๋“  ๋ทฐ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋ทฐ์— ๋ถ™์—ฌ์ค€๋‹ค. ListView 1.๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ์•„์ดํ…œ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•œ๋‹ค. 2.adapter๋ฅผ ์ด์šฉํ•œ๋‹ค RecycleView -์žฅ์  ๋ฆฌ์ŠคํŠธ ๋ทฐ์˜ ๊ฐœ์„ ํŒ(ViewHolder ํฌํ•จ) ์œ ์—ฐํ•˜๋‹ค ์‚ฌ์šฉ๋ฒ• 1.์•ฑ ๋ชจ๋“ˆ์˜ build.gradle ํŒŒ์ผ ์—ด๊ธฐ dependenciesย ์„น์…˜์— ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ย  ย  dependencies { ย  ย  ย  ย  implementation 'com.android.support:recyclerview-v7:28.0.0' ย  ย  } ย  ย 

์ถœ์ฒ˜: <https://developer.android.com/guide/topics/ui/layout/recyclerview> 

classRecycleViewActivity:AppCompatActivity(){

overridefunonCreate(savedInstanceState:Bundle?){
	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_recycle_view)
	valcarList=ArrayList<CarforList>()
	for(iin0until50){
		carList.add(CarforList(""+i+"๋ฒˆ์งธ์ž๋™์ฐจ",""))
	}
	valadapter=RecyclerViewAdapter(carList,LayoutInflater.from(this@RecycleViewActivity))
	recycler_view.adapter=adapter
	recycler_view.layoutManager=LinearLayoutManager(this@RecycleViewActivity)
}
}
classRecyclerViewAdapter(
	valitemList:ArrayList<CarforList>,
	valinflater:LayoutInflater
):RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>(){
	classViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){//์ƒ์„ฑ์ž์—๋ฐ›์€์•„์ดํ…œ์„
		//๋„˜๊ฒจ์คŒ
		valcarName:TextView
		valcarEngine:TextView
		init{
			carName=itemView.findViewById(R.id.car_name)
			carEngine=itemView.findViewById(R.id.car_engine)
			itemView.setOnClickListener{
				valposition:Int=adapterPosition // ํฌ์ง€์…˜์„ ๊ฐ€์ ธ์™€์คŒ
				valenginename=itemList.get(position).engine
			
			}
			
			
		}
	}
	
		overridefunonCreateViewHolder(parent:ViewGroup,viewType:Int):ViewHolder{//๋ทฐ๋ฅผ๋งŒ๋“ฌ
		valview=inflater.inflate(R.layout.item_view,parent,false)
		returnViewHolder(view)
	}
	
	overridefungetItemCount():Int{
		returnitemList.size
	}
	
	overridefunonBindViewHolder(holder:ViewHolder,position:Int){//๋ทฐ๋ฅผ๊ทธ๋ ค์ฃผ๋Š”๋ถ€๋ถ„
		holder.carName.setText(itemList.get(position).name)//holder๋Š”์šฐ๋ฆฌ๊ฐ€์œ„์—์„œ๋งŒ๋“ ViewHolder
	}
}
์ด์ œ ํ•ด๋‹นํ•˜๋Š” ํฌ์ง€์…˜์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์ •๋ณด๋ฅผ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋” ๋งŒ๋“ค๊ณ  ์‹ถ์Œ. 
๋ทฐ ํ™€๋” init ์•ˆ์— ์ด๋ ‡๊ฒŒ ์ ์–ด์คŒ
itemView.setOnClickListener{
	valposition:Int=adapterPosition // ํฌ์ง€์…˜์„ ๊ฐ€์ ธ์™€์คŒ
	valenginename=itemList.get(position).engine

}
์—ฌ๊ธฐ์„œ itemList๋Š” ํด๋ž˜์Šค ์™ธ๋ถ€ ๋ณ€์ˆ˜ ์ด๋ฏ€๋กœ viewHolder ๋ฅผ์ด๋„ˆ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์คŒ inner  ํ‚ค์›Œ๋“œ๋ฅผ ํด๋ž˜์Šค ์•ž์— ๋ถ™์—ฌ์คŒ


ViewHolder ์— 
LayoutManager
1. LinearLayoutManager
recycler_view.layoutManager=LinearLayoutManager(this@RecycleViewActivity)
2. GridLayoutManager
recycler_view.layoutManager=GridLayoutManager(this@RecycleViewActivity,2)

 Tablayout,Pager 
- ์•ฑ์„ ๋ณด๋ฉด ํƒญ๋“ค์ด ์žˆ๋Š”๋ฐ ํด๋ฆญํ•˜๊ฒŒ๋˜๋ฉด ํ™”๋ฉด์ด ์ „ํ™˜๋˜๋Š” ๊ทธ๋Ÿฐ ํƒญ๋“ค.
	Pager
- ๋ฉ”์ธํ™”๋ฉด์„ ์ข…์ด๋„˜๊ธฐ๋“ฏ์ด ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• 	
	โ€ข Tablayout
- Tab์„ ๋‹ด๋‹นํ•˜๋Š” ์—ญํ• 	
	โ€ข Adapter
- Tablayout๊ณผ pager ์„์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• 	

<androidx.viewpager.widget.ViewPager
Tablayout ์ธํ„ฐ๋„ท์—์„œ ๊ฐ€์ ธ์™€์คŒ
implementation'com.google.android.material:material:1.0.0'
6/04
Tab ์€ ํ™”๋ฉด์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š”๋ฐ ์šฐ๋ฆฌ๊ฐ€ ๋ชป๋ณด๋Š” ๊ฑธ ๋ณด์—ฌ์ฃผ๋Š”       ๊ฒƒ
Fragment 1 , 2, 3 ์„ ๋งŒ๋“  ๋‹ค์Œ
TabPagerActivity๋กœ ๋„˜๊ธด๋‹ค์Œ์— ๊ทธ TabPaging ํ• ๊บผ์ž„
Fragment ์—๋Š” ๊ธฐ๋ณธ์ ์ธ onCreateView ๋“ค์–ด์žˆ๋‹ค.
classFragment2:Fragment(){
	overridefunonCreateView(
		container:ViewGroup?,
		inflater:LayoutInflater,
		savedInstanceState:Bundle?
	):View?{
		returninflater.inflate(R.id.fragment_one,container,false)
	}
}
-๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค
1. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•จ
-๋ฐ์ดํ„ฐ ์ €์žฅ๋ฐฉ์‹
- RDB(Relational DataBase)-๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
	-์—‘์…€์ฒ˜๋Ÿผ ์ƒ๊ฒผ๋‹ค
- Key-value
	โ€ข ์Œ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹(ํ‚ค,๋ฒจ๋ฅ˜)
- RDBMS(Relational Database Management system)
	โ€ข RDB๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํˆด
	โ€ข MySQL 
	โ€ข Oracle
	โ€ข PostgreSQL
- SQL
	โ€ข RDBMS๋ฅผ ์œ„ํ•œ ์–ธ์–ด์ด๋‹ค.
- NoSQL
	โ€ข SQL๋ง๊ณ  ๋‹ค๋ฅด๊ฒŒ ํ•ด๋ณด์ž!
	โ€ข ๊ฒ€์ƒ‰์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋น ๋ฆ„
	โ€ข MongoDB? 
- ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
	โ€ข SQLiteDatabase
	โ€ข SharedPrefrence (์ด์นœ๊ตฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•จ)(key-value)

-๋ชฉ์ = ๊ณต์œ ๋œ ์‚ฌ์šฉ์ž์˜ ๊ธฐํ˜ธ๋ฅผ ์ €์žฅ - ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ฅผ ๊ตฌ์ƒ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋„์›€์„ ๋ฐ›๋Š”๋ฐ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ ๋Ÿฌ๋ฆฌ๋Š” Realm - https://realm.io/kr/docs/java/latest/#getting-started ์„ค์น˜ํ•˜๊ธฐ Realm์€ Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ๋‹จ๊ณ„ 1:ย ์•„๋ž˜์˜ ํด๋ž˜์Šค ํŒจ์Šค ์˜์กด์„ฑ์„ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ย build.gradleย ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath "io.realm:realm-gradle-plugin:3.5.0"
}

}

์ถœ์ฒ˜: <https://realm.io/kr/docs/java/latest/#getting-started> 
๋‹จ๊ณ„ 2:ย realm-androidย ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€ย build.gradleย ํŒŒ์ผ์—์„œ ์ ์šฉ์‹œํ‚ต๋‹ˆ๋‹ค.

apply plugin: 'realm-android'

์ถœ์ฒ˜: <https://realm.io/kr/docs/java/latest/#getting-started> 

์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ applyplugin:'kotlin-kapt' 
 ์ถ”๊ฐ€์‹œ์ผœ์ฃผ๋ฉด ์˜ค๋ฅ˜ ํ•ด๊ฒฐ,
ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ์นœ๊ตฌ๋“ค์ด ์žˆ์–ด์„œ realm์€ ๊ฐ€์žฅ ์•„๋ž˜์— ์œ„์น˜ ์‹œ์ผœ ๋†“๋Š”๋‹ค.
Valconfig:RealmConfiguration=RealmConfiguration.Builder()
.deleteRealmIfMigrationNeeded()
.build()
Builder() ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ฉ”์„œ๋“œ์ฒด์ธ ๋ฐฉ์‹์œผ๋กœ ๋งŽ์ด ํ™œ์šฉํ•จ
	Async
- ๋น„๋™๊ธฐ ๋ฐฉ์‹
- ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž‘์—…์„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.(์ •ํ™•ํžˆ, ๋งํ•˜๋ฉด ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ธฐ ๋ณด๋‹จ ๋ฐฑ๊ทธ๋ผ์šด๋“œ).
	์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ Async ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•
- AsyncTask ๋ฅผ ์ƒ์†๋ฐ›์Œ
	โ€ข ->onPreExcute :์“ฐ๋ ˆ๋“œ ์ถœ๋ฐœํ•˜๊ธฐ์ „์— ํ• ์ž‘์—…
	โ€ข ->doIntBackground : ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•  ์ž‘์—…
	โ€ข ->onPregressUpdate : ์ค‘๊ฐ„์ค‘๊ฐ„์— MainThread๋กœ ์˜จ๋‹ค(์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ ) Progress๋ฐ”  ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉ
	โ€ข ->onPostExcute : ์ž‘์—…์„ ๋‹ค ๋งˆ์นœ ํ›„ MainThread
	Async๋กœ Progress๋ฐ” ์‹ค์Šต
	6/05
	๋„คํŠธ์›Œํฌ
- ํ†ต์‹ 
- DataBase <------>Server <------>Client(app,web)
	โ€ข (๋ฒˆ์™ธ๋กœ ๋กœ์ปฌ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ชฝ์— ํ• ๋‹น๋˜๋‹ˆ๊นŒ ์„œ๋ฒ„๊ฐ€ ํ•„์š” ์—†์ง€ ์•Š๋А๋ƒ ?  -> 
- LocalDataBAse ์˜ ํ•œ๊ณ„
	โ€ข ๋™๊ธฐํ™”๊ฐ€ ์–ด๋ ต๋‹ค
	โ€ข ์ƒํ˜ธ์ž‘์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.(๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ)
์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š”๋ฒ•
	ํ•ด๋‹น URL๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ
	์ธ์ฆ์ •๋ณด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค
	๊ธ€ ๋Œ“๊ธ€ ์„ ์“ธ๋•Œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ (URL๋กœ)๊ฐ™์ด ๋ณด๋‚ด๋Š”๋ฐ ๊ทธ๊ฑด JSON  ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค
Json(javascript Object Notation -> Javascript์—์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹)
Json  ํ˜•์‹
[] = ๋ฆฌ์ŠคํŠธ {} = ๊ฐ์ฒด
	[
		{
		}
	]
Json Parsing
	-> Json์„ ์ฝ”ํ‹€๋ฆฐ์ด๋‚˜ ์ž๋ฐ”๊ฐ€ ์ดํ•ดํ• ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ˜•ํ•˜๋Š” ๊ณผ์ •
Serializable (์ง๋ ฌํ™”)
Request ํƒ€์ž…
	GET POST DELETE PUT
StatusCode
200 -> good
400๋ฒˆ๋Œ€

Json ํ˜•์‹์„ ์šฐ๋ฆฌ๊ฐ€ BufferReader(InputStreamReader(connection.inputstream).readLine() ์œผ๋กœ ์ฝ์—ˆ๋Š”๋ฐ ์ด ํ˜•์‹์„ ์ง๋ ฌํ™”ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„  ๊ท€์ฐฎ์œผ๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์ค€๋‹ค.
gson
dependencies {

implementation 'com.google.code.gson:gson:2.8.6' }

์ถœ์ฒ˜: <https://github.com/google/gson> 
์ „์—๋Š” ์ง์ ‘ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ–ˆ์ง€๋งŒ ์ด๋ฒˆ์—๋Š”
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์›€์„ ๋ฐ›์•„์„œ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š”๋ฒ•
(๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ฒƒ๋“ค)(์•ฑ์˜ ๋„คํŠธ์›Œํ‚น์„ ๋” ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” HTTP ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
-Volly (๊ตฌ๊ธ€ ์ •์‹ ๋””๋ฒจ๋กœํผ ๋„คํŠธ์›Œํฌ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
-Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.0'

implementation 'com.squareup.retrofit2:converter-gson:2.6.0'

์ถœ์ฒ˜: <https://jungwoon.github.io/android/2019/07/11/Retrofit/> 


ํ™”๋ฉด ํšŒ์ „

About

study Android based on Kotlin

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages