4/25 수업

hyunji·2023년 4월 25일
0

공부법

  • 기초를 잘 다져야 한다
  • 무지성강의도 필요하지 않나...?
  • 지금은 할 수 없으니까 무지성 학습 필요..

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())
        }
}

0개의 댓글