본문 바로가기
공부기록/안드로이드

[안드로이드] Fragment to Fragment 데이터 쉽게 전달하기(자료형이 List 일 때)

by 책읽는 개발자 ami 2021. 1. 27.
728x90
반응형

준비물

  1. Fragment 3개
  2. layout 3개(container가 될 레이아웃 1개 + 사용자에게 보여질 뷰로 구성되어 있는 레이아웃 2개)

코드

home_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:id="@+id/home_layout"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </LinearLayout>
</LinearLayout>

 

Fragment_1.java

public class Fragment_1 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.home_layout, null, false);
        getFragmentManager().beginTransaction().replace(R.id.home_layout, new Fragment_1_Home()).addToBackStack(null).commit();
        return view;
    }
}

 

- 아무런 역할 없이 Fragment_1_Home 로 바로 전환됨

 

Fragment_1_Home.java

public class Fragment_1_Home extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.home_home_layout, null, false);
        List<String> basic_name = new Vector<>();
        //basic_name에 데이터 삽입하는 부분 생략
        getFragmentManager().beginTransaction().replace(R.id.home_layout,
                Fragment_1_Child.newInstance(basic_name.toArray(new String[basic_name.size()]))
                .addToBackStack(null)
                .commit();
        return view;
    }
}

 

- Fragment 에서 Fragment로 데이터를 넘기기 위해선 데이터를 받는 Fragment를 newInstacne로 생성해준다.

- String이나 int 등 기본 자료형을 넘길 땐 간단하다. 그러나 나는 List 형을 넘기고자 했기 때문에 List를 Array로 변환하는 과정이 필요했다.

List<String> to StringArray => List변수.toArray(new String[List변수명.size()])

 

Fragment_1_Child.java

public class Fragment_1_Child extends Fragment {

    public static Fragment_1_Child newInstance(String[] name) {
        Bundle args = new Bundle();
        args.putStringArray("basic_name", name);
        Fragment_1_Child fragment = new Fragment_1_Child();
        fragment.setArguments(args);
        return fragment;
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.home_child_layout, null, false);
        if (getArguments() != null) {
            basic_name = getArguments().getStringArray("basic_name");
        }
        return view;
    }
}

 

- newInstance를 통해 데이터를 받고 setArguments("key", value)에 저장한 뒤, onCreateView에서 getArgument.getXXX("key")로 꺼내올 수 있다.

728x90
반응형