공부법
- 기초를 잘 다져야 한다
- 무지성강의도 필요하지 않나...?
- 지금은 할 수 없으니까 무지성 학습 필요..
Fragment
Fragment 언제 써?
Fragment 뭐야?
- 하나의 액티비티 안에 여러 개의 Fragment가 존재함
사용하는 이유
- 필요에 맞게 쓰면 된다.
- 모듈화는 확실한 장점임, 하나의 모듈로 보면 장점이 있음
생명주기
- 액티비티 라이프사이클보다 더 많음
- 생명주기 직접 찍어봐라!!!!!!!!!!!!꼭!
- onCreate() : Fragment를 생성할 때 호출
- onCreateView() : Fragment가 자신의 UI를 처음 그리기 위해 호출하며 View를 반환
- onPause() : Fragment를 떠났을 때 호출
사용법
//val fragmentManager = supportFragmentManager
//val fragmentTransaction = fragmentManager.beginTransaction
//fragmentTransaction.setReorderingAllowed(true)
supportFragmentManager.commit {
setReorderingAllowed(true)
add(R.id.fragment_container_view, MyFragment())
}
val button = findViewById<Button>(R.id.button)
val fragment2 = BlankFragment2()
buttin.setOnClickListener {
fupportFragment.commit{
setRecoderingAllowed(true)
replace(R.id.fragment_container_view, fragment2)
}
}
데이터 전달
- Activity에서 Fragment로 데이터 전달
//보내는 쪽
val fragment = NewFragment()
val bundle = Bundle()
bundle.putString("key", "value")
fragment.arguments = bundle
//받는 쪽
arguments?.let {
it.getString("key")
}
supportFragmentManager.commit {
setReorderingAllowed(true)
add(R.id.fragment_container_view, MyFragment())
}
val button = findViewById<Button>(R.id.button)
val fragment2 = BlankFragment2()
val bundle = Bundle()
buttin.setOnClickListener {
fupportFragment.commit{
setRecoderingAllowed(true)
bundle.putString("key", "value")
fragment.arguments = bundle
replace(R.id.fragment_container_view, fragment2)
}
}
val fragment = NewFragment()
val bundle = Bundle()
bundle.putString("key", "value")
fragment.arguments = bundle
setFragmentResult("key", bundle)
setFragmentResultListener("key") { _, bundle ->
bundle.getString("key")
}
Broadcast Receiver
Broadcast Receiver란?
- 다른 컴포넌트와 연동하여 사용할 수 있다.
- 수신한 이벤트를 기반으로 Service나 Activity 실행 가능
- 동적으로 등록하여 필요할 때마다 사용할 수 있다.
- 코드에서 동적으로 등록하여, 특정 이벤트가 발생할 때만 동작 가능
- AndroidManifest 파일에 등록
등록 방법
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SCREEN_ON" />
</intent-filter>
</receiver>
- 위와 같은 메니페스트 등록 하기는 이젠 안됨
- 변했음
- 그대신 코드에서 동적으로 등록하면 됨
val myReceiver = MyReceiver()
val filter = IntentFilter().apply {
addAction(Intent.ACTION_SCREEN_ON)
}
registerReceiver(myReceiver, filter)
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_SCREEN_ON) {
// TODO:
}
}
// 등록했던 필터에 대한 이벤트가 들어오게 됨
라이브 코딩
//AdroidManifest
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
//MainActivity
val myReceiver = MyReceiver()
val filter = IntentFilter().apply {
addAction(Intent.ACTION_SCREEN_ON)
addAction("test)
}
registerReceiver(myReceiver, filter)
//인텐트를 통해서 브로드캐스트에도 데이터를 줄 수 있지 않을까? 어떻게?
val intent = Intent()
intent.action = "test"
intent.putExtra("test", "hello")
sendBroadcast(intent)
//MyReceiver.class
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_SCREEN_ON) {
Toast.makeTest(context, "Screen is On", Toast.LENGTH_SHORT.show())
} else if(intent.action == "test") {
val data = intent.getString("test")
Toast.makeTest(context, data, Toast.LENGTH_SHORT.show())
}
}