- Today
- Total
프로그래밍 농장
Android Studio [ Activity -> Fragment 데이터 전송이슈 ] 본문
'Notichair' 라는 스마트의자 프로젝트를 진행중 문제가 발생하였다.
프로젝트 중 앱개발 과정에서 BottomNavigation을 사용하여 하단바를 구성하였는데, 이떄부터 문제가 발생했다.
하단바의 경우 Fragment 로 갈아끼워주는 원리인데 이떄문에 기존에 쉽게 구현할수있는 기능들을 구현하기위해 몇번씩은 더 돌아가고 어렵게 구현해야하는경우가 발생하였다.
그중 대부분은 여차저차 해보았지만, 액티비티 -> 프라그먼트 상 데이터 전송은 조금 더 어려운것같다.
단순히 액티비티 -> 프라그먼트가아니라 이 프라그먼트가 바텀네비게이션에 들어가있어서 애를 먹고있다..
프로젝트가 조금 꼬일것같은 느낌이다
+ 2020.12 해결
프로젝트를 진행하며 해당부분을 해결하여 간략하게 정리한다.
App을 개발하다보면 Activity <-> Fragment 간에 데이터나 결과/요청 코드를 많이 주고 받게 된다.
이는 크게 2가지 경우로 나눌 수 같다.
- 말 그대로 데이터만 전달하는 경우
- 이동한 Activity 또는 Fragment에서 결과를 받아 다시 돌아와서 할 작업이 있는 경우
Fragment/Activity -> Activity
(1) Intent1 에서 Intent2로 데이터를 가지고 이동하기
- 첫번째 방법
// 제일 단순하고 쉬운 방법
val intent = Intent(this@Intent1,Intent2::class.java)
intent.putExtra("num1",1) //데이터 넣기
intent.putExtra("num2",2) //데이터 넣기
startActivityForResult(intent,101)
// 이동한 activity에서 추후 받아올 데이터가 없는
// 단순 데이터 전달 및 이동의 경우
// startActivity(intent)
- 두번째 방법
//두번째 방법
val intent = Intent(this@Intent1,Intent2::class.java)
//코틀린의 유용한 기능 apply
//한눈에 모아서 볼 수 있어서 유용
intent.apply {
this.putExtra("num1",1) // 데이터 넣기
this.putExtra("num2",2) // 데이터 넣기
}
startActivityForResult(intent,101)
// 이동한 activity에서 추후 받아올 데이터가 없는
// 단순 데이터 전달 및 이동의 경우
// startActivity(intent)
(2) Intent2에서 데이터 받기
//마지막 인자로 defaultValue를 꼭 넣어줘야함 null일수 있으니
val number1 = intent.getIntExtra("num1", 0)
val number2 = intent.getIntExtra("num2", 0)
(3) 결과 코드 가지고 Intent1로 이동하기
val resultIntent = Intent()
resultIntent.putExtra("result","333")
setResult(Activity.RESULT_OK,resultIntent)
//액티비티 종료! -> 이전의 Activity인 Intent1로 이동됨
finish()
(4) Intent1에서 데이터 받기
// requestCode : (1)에서 보내줬던 요청 코드
// resultCode : Intent2에서 보낸 결과 코드
// data : Intent2에서 보낸 데이터
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode==Activity.RESULT_OK){
val result = data.getIntExtra("result",0)
Log.d("data",""+result)
}
}
Fragment/Activity -> Fragment
(1) Fragment1에서 Fragment2로 데이터 가지고 이동하기
var fragment2 = Fragment2()
var bundle = Bundle()
bundle.putInt("num1",1)
bundle.putInt("num2",2)
fragment2.arguments = bundle //fragment의 arguments에 데이터를 담은 bundle을 넘겨줌
activity?.supportFragmentManager!!.beginTransaction()
.replace(R.id.view_main, fragment2)
.commit()
(2) Fragment2에서 데이터 받기
val num1 = arguments?.getInt("num1")
val num2 = arguments?.getInt("num2")
정리
Activity/Fragment ==> Fragment
: Bundle을 사용한다.
1) 이동할 Fragment 객체 생성 2) Bundle 객체 생성 및 데이터 저장 → bundle.putXXXX(name, value) 3) Fragment객체.arguments = Bundle객체
Activity/Fragment ==> Activity
: Intent를 사용한다.
1) 이동할 액티비티 클래스를 담고 있는 Intent 객체 생성 2) Intent객체.putXXXExtra(name, value) 3) startActivity(Intent객체)
++ 출발지에 따른 startActivity
activity인 경우 : startActivity(intent) fragment인 경우인 경우 : activity.startActivity(intent)
참고자료 : https://developer.android.com/training/basics/fragments/pass-data-between?hl=ko
'Android Studio' 카테고리의 다른 글
Firebase 연동후 사용자 등록 안될시 [ Android Studio ] (0) | 2021.05.14 |
---|---|
올바른 방법으로 Android Splash 화면을 구현하는 방법 [ Android Studio ] (0) | 2021.04.10 |
안드로이드 스튜디오 단축키 [ Android Studio ] (0) | 2021.03.18 |
Activity Lifecycle [ Android Studio ] (0) | 2021.03.17 |
Branch를 이용하여 Github에 업로드 [Android studio ] (0) | 2021.03.17 |