프로그래밍 농장

Android Studio [ Activity -> Fragment 데이터 전송이슈 ] 본문

Android Studio

Android Studio [ Activity -> Fragment 데이터 전송이슈 ]

Tennessee201 2020. 12. 11.
728x90

'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

728x90