[오늘 배운 내용]
-1- RegisterForActivityResult 로 Acitivity간의 데이터 이동
- RegisterForActivityResult란?
- Android studio Activity Result API에서 제공되는 기능으로 AndroidX Activitiy 1.3.0 이상에서 사용할 수 있다.
- Activity 또는 Fragment와 같은 컴포넌트에서 다른 Activity또는 Fragment등의 컴포넌트와 상호작용을 처리하는데에 사용되는 기능이다.
- ActivityResultContract 와 AcitivityResultCallBack을 매개변수로 받고 다른 Activity를 실행하는데 사용할 ActivityResultLauncher를 반환한다.
-
- ActivityResultContract
- Intent나 Permission 등의 액션을 제공하고, 결과를 출력하는 타입(형태)정의.
- ActivityResultCallback
- 결과 데이터를 처리하는 콜백 함수.
- ActivityResultLauncher
- Contract와 Callback 객체를 등록한 후 launch() 함수로 실행할 수 있다. 이벤트가 발생되면, ActivityResultLauncher에 등록된 Contract 객체가 실행 요청을 처리하여 그 결과를 Callback에 전달해 사후 처리가 되도록 한다. 이때 Contract는 ActivityResultContract를 상속받은 서브 클래스이며, 직접 만들거나, API에서 제공되는 클래스를 이용.
- ActivityResultContract
- RegisterForActivityResult() 생성 예시 코드
val myActivityResult = registerForActivityResult(YourContract()) { result ->
// 결과 처리 로직
}
-
- registerForAcitivity() 소괄호 안에 사용할 Contract 클래스를 넣어주면 된다.
- 자주 사용되는 대표적인 Contract 클래스는 StartAcitivityForResult, RequestPermission 등이 있다.
- StratActivityForResult
- Intent 객체를 받아서 새로운 액티비티를 시작하며, 그 액티비티가 종료되면 그 결과인 AcitivityResult 객체가 반환된다.
- 생성해둔 registerForActivityResult 객체.launch() 메서드를 사용하여 액티비티를 호출한다.
- StratActivityForResult
StrartActivityForResult 사용예시
companion object {
const val BOOLEAN_INTENT_KEY = "my_boolean_key"
const val INT_INTENT_KEY = "my_int_key"
}
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Intent? = result.data?.getStringExtra()
// RESULT_OK인 경우 결과 데이터 처리
} else {
// RESULT가 OK가 아닌 경우 데이터 처리
}
}
// 결과를 받아올 액티비티 호출
val intent = Intent(this, OtherActivity::class.java)
startForResult.launch(intent)
-
-
- RequestPermission
- RequestPermission은 하나의 permission 문자열을 입력으로 받아서 권한 요청을 실행하며, 사용자가 권한 요청에 응답하면 Boolean값으로 반환된다
- 생성해둔 registerForActivityResult 객체.launch() 메서드를 사용하여 요청할 권한을 전달하고 그 결과 값을 받아온다.
- RequestPermission
-
RequestPermission 사용예시
val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
// 권한이 허용된 경우 처리
} else {
// 권한이 거부된 경우 처리
}
}
// 권한 요청
requestPermission.launch(Manifest.permission.CAMERA)
RegisterForAcitivtyResult.StartActivityForResult 작성 코드
- 액티비티 B 의 editText에 넣은 데이터를 액티비티A (Main)으로 가져와 각 값이 textView에 표시 되도록 작성
액티비티A.kt
class MainActivity : AppCompatActivity() {
companion object {
const val ID_STRING_INTENT_KEY = "id_string_key"
const val NUM_INT_INTENT_KEY = "num_int_key"
}
private val setIdAndNum = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val returnId = result.data?.getStringExtra(ID_STRING_INTENT_KEY)
val returnNumber = result.data?.getIntExtra(NUM_INT_INTENT_KEY,0)
binding.tvId.text = returnId
binding.tvNum.text = returnNumber.toString()
}
}
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.mainBtnMoveToSecond.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
setIdAndNum.launch(intent)
}
}
}
액티비티B.kt
class SecondActivity : AppCompatActivity() {
private lateinit var binding : ActivitySecondBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySecondBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.secondBtnMoveToMain.setOnClickListener {
val inputId = binding.editInputId
val inputNum = binding.editInputNum
if (inputId.text.isNullOrBlank() || inputNum.text.isNullOrBlank())
{}else{
intent.putExtra(MainActivity.ID_STRING_INTENT_KEY,inputId.text.toString())
intent.putExtra(MainActivity.NUM_INT_INTENT_KEY,inputNum.text.toString().toInt())
Log.d("TAG", "input num : ${intent.getIntExtra(MainActivity.NUM_INT_INTENT_KEY,0 )}")
setResult(RESULT_OK,intent)
finish()
}
}
}
}
[오늘 복습한 내용]
1. ... 생각나는 복습 내용이 없다.
[오류,에러 등등]
1. B이 별도로 백그라운드 옵션을 주지 않았는데도 검은색으로 나온다
해결방법
- 테마 스타일을 건드렸더니 생긴 문제더라.
< !-- Material3 적용해주니까 정상적으로 보임.. -->
[느낀 점]
1. 앉아있는 시간에 비해서 학습양이 적은 느낌이다. 집중하는 시간을 조금 더 늘려야겠다
2. 앉아있으니까 군것질 계속 하게된다.
3. 점점 아침에 일어나기 힘들다. 체력을 길러야겠다.
[Reference]
// registerForActivity
https://kkangsnote.tistory.com/185
https://developer.android.com/training/basics/intents/result
// ActivityResultLauncher
'TIL' 카테고리의 다른 글
[TIL] Fragment간의 데이터 Bundle 통하여 옮기기, Bundle을 사용하는 이유. (0) | 2023.09.03 |
---|---|
[TIL] Fragment에 RecyclerView 적용하기 (0) | 2023.09.02 |
[TIL] Lambda를 이용해 Dialog 분리해서 제어하기, FloatingButton으로 RecyclerView 스크롤 상단으로 이동하기 (0) | 2023.08.31 |
[TIL] 뒤로가기 버튼 클릭 이벤트 | putExtra, getParcelableExtra로 데이터 옮기기 (0) | 2023.08.30 |
[TIL] Dialog, 알림 (Notification), Intent FLAG (0) | 2023.08.29 |