마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

프래그먼트와 엑티비티 간의 데이터 전달 방법이 궁금합니다

0 추천

2017년도 몇일 안남았는데 한 해 마무리 잘하세욥 ~~

 

먼저 제 증상을 자세히 쓰고 싶어 좀 긴글이 될것같습니다

 

질문의 내용으로 현재 제가 MainActivity에 TabLayout과 ViewPager를 이용하였

습니다

 

탭1, 탭2, 탭3 을 누르게 되면 바로 아래 프래그먼트가 계속 바뀌어지는 형태로 ViewPagerAdapter도 이용했습니다

(탭1 - 프래그먼트1  /  탭2 - 프래그먼트2  / 탭3 - 프래그먼트3)

 

MainActivity에서 플로팅 엑션 버튼을 누르게 되면 SubActivity로 넘어가게 되며

 

SubActivity에서 처리된 데이터를 탭1에 달린 프래그먼트1에 넣고 싶습니다

 

현재까지 제가 적용해본 방법으로

1. Intent를 사용해서 SubActivity -> 프래그먼트1  : 안됨

2. Intent를 사용해서 SubActivity -> MainActivity -> 프래그먼트1 : 안됨

3. Bundle 이용해서 SubActivity -> 프래그먼트1 : 실패

실패 원인 : java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String, java.lang.String)' on a null object reference

 

-> SubActivity에서 넘겨주는 코드

 

 

TabFragment tabFragment = new TabFragment();
Bundle bundle = new Bundle();
bundle.putString("NicNameF", FindNicName);
tabFragment.setArguments(bundle);

 

 

-> 프래그먼트1에서 받는 코드

 

 

        bundle = getArguments();
//        if(bundle != null) {
        NicF = bundle.getString("NicNameF");
//    }

 

 

다음과 같이 했을때 주석처리된 if문을 해줘도 어째든 bundle 값이 null 로 떠서 값이 넘어오질 않습니다

 

혹시 제가 어디를 건드려 봐야 할까요?

BeMore (170 포인트) 님이 2017년 12월 26일 질문

1개의 답변

0 추천
 
채택된 답변
full code가 아니라서 정확하지 않을 수 있습니다만,
언급된 내용을 바탕으로 답변 드립니다.

상황을 보니 SubActivity의 data를 MainActivity의 프래그먼트1(탭1)으로 전달하려고
하는 것 같습니다.

우선 SubActivity와 MainActivity는 callStack관계 임으로 서로 data를 주고 받을 방법은
startActivityForResult() - setResult() - onActivityResult() 방식이 되어야합니다.

위의 방법으로 MainAcitivity까지 data가 전달되면, 프래그먼트1(탭1)에는 새로 정의된
function call로 instance에 직접 전달 가능합니다.

setArguments()는 프래그먼트 instance가 새로 생성할때만 이용가능한 API입니다.
SubActivity에서 MainActivity로 돌아올때는 프래그먼트 instance가 새로 생성되는 경우가
아니므로 사용할 수 있는 상황이 아닙니다.
디자이너정 (42,810 포인트) 님이 2017년 12월 27일 답변
BeMore님이 2017년 12월 27일 채택됨
답변 주셔서 감사합니다

엑티비티간의 인텐트를 이용한 데이터 전송은 충분한 연습이 잇었기에 어려움이 없었지만

현재 프래그먼트를 처음 사용하면서 엑티비티에서 프래그먼트로 / 프래그먼트에서 엑티비티로 데이터를 넘겨주고 받는 부분이 상당히 어려웠습니다

현재도 엑티비티에서 프래그먼트로 데이터를 전달할때 프래그먼트의 함수를 엑티비티내에서 불러와 값을 넣어주는 방식으로 프래그먼트에 전달하였고

프래그먼트에서는 엑티비티로 쉐어드를 사용해서 넘겨주었습니다

실상 프래그먼트에서 엑티비티로 intent를 사용해서 넘길수는 있으나 문제가 되는것이

Intent intent = Intent(getActivity() , 메인Activity)
intent.putString(값);
startActivity(intent)

위와 같은 구문으로 넘겨주게 된다면 탭을 1~3까지 이동중에 해당 탭의 프래그먼트를 가진 엑티비티를 종료할때 강제로 다시 엑티비티로 들어와지는 문제가 발생하였습니다

그래서 쉐어드를 사용했는데 혹시 이 부분을 해결 할 수 있는 방법이 있을지요?


간략화

프래그먼트 -> 인텐트사용 -> mainActivity로 전달 ( 프래그먼트를 구성하고 있는 엑티비티) -> mainActivity 백키눌러서 나감 -> 문제발생 : 강제로 다시 들어와짐

추가 문제 사항 : 총 3개의 탭에 각각의 프래그먼트가 구성되 있고 탭을 여러번 왔다갔다 이동하면 그만큼 뒤로가기를 눌러줘야 mainActivity를 빠져 나올수 있었습니다
...