최근 팀과제를 하면서 Activity보다 Fragment를 자주 이용하다보니 프래그먼트 <-> 프래그먼트간의 데이터 전달하는 방법을 자연스럽게 알게 되었다. 프래그먼트 간의 데이터를 전달할 땐 Bundle 객체를 이용하는데 Bundle을 데이터를 담는 바구니로 생각하면 이해하기 쉽다.
데이터를 보내는 프래그먼트의 코드는 다음과 같다.
// 프래그먼트 -> 프래그먼트 데이터 전달
// 데이터를 전달하는 프래그먼트 코드
// in FragCalssA
FragClassB f = new FragClassB(); // 데이터를 전달할 타 프래그먼트 생성
ClassA classa = new ClassA(); // 예시 데이터 : 객체
Bundle bundle = new Bundle(); // 데이터를 담을 bundle 생성
bundle.putSerializable("ClassA", classA); // 데이터를 식별할 key와 data를 bundle에 넣음
f.setArguments(bundle); // 타 프래그먼트에 bundle 전달
// 프래그먼트 변경 Manager
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace((변경하는 viewID), f).commit(); // 프래그먼트 변경
여기서 bundle에 어떤 데이터유형의 데이터를 집어넣는가에 따라 메소드가 달라진다.
bundle.punInt(key, data); // int형 데이터
bundle.putIntArray(key, data); // int형 Array 데이터
// - 다른 데이터형의 Array를 담을 때는 Array앞에 다른 데이터형을 붙여주면 된다.
bundle.putString(key, data); // String형 데이터
bundle.putParcelableArrayList(key, data); // ArrayList 데이터 (extends Parcelable)
bundle.putSerializable(key, data); // Object 데이터 (extends Serializable)
이외에도 여러 데이터유형의 데이터를 bundle에 담을 수 있다.
데이터를 받는 프래그먼트의 코드는 다음과 같다.
Bundle bundle = getArguments(); // bundle 가져오기
ClassA classa = (ClassA) bundle.getSerializable("ClassA");
// bundle에 담긴 "ClassA" key에 맞는 value 데이터 가져오기
위와 같은 코드대로 작성을 하면 프래그먼트간의 데이터전달이 가능하다.