์๋๋ก์ด๋ ๊ณต๋ถ ๊ฐ๋ฐ ์ด๋ ๋ฌด์์ผ๊น?
-
์๋ฒ๊ฐ๋ฐ์ 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 ์ ์์ฑ์ผ๋ก ํฌ๊ธฐ ์์ ๋ฑ์ด ์์ง๋ง ์์น๋ฅผ ๋ฐ๊ฟ์ ์์. ์ฆ ๋ถ๋ชจ์ปดํฌ๋ํธ ๋ค๋ก ๋ฐฐ์น๋ฅผ ํด์ผํจ
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/>
ํ๋ฉด ํ์