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

프래그먼트 간 데이터 전달 중에 문제가 생겼습니다.

0 추천
Home이라는 프래그먼트와 Study라는 프래그먼트가 있습니다.

Home > Study로 데이터를 전달하려고 합니다.

Bundle bundle = new Bundle(4);
                    bundle.putString("db", db);
                    bundle.putInt("img", img);
                    bundle.putString("title", title);
                    bundle.putString("singer", singer);
                    
Study study = new Study();                
study.setArguments(bundle);

해당 코드를 통해 Home에서 각각의 데이터를 Bundle을 사용해 보내주었습니다.

Bundle bundle = getArguments();
        if(bundle != null) {
            db = bundle.getString("db");
            title_name = bundle.getString("title");
            img = bundle.getInt("img",0);
        }

또한, Study 코드에서 해당 데이터를 저장하였습니다.

하지만 Log결과 Null값으로, 데이터가 넘어오지않았습니다.

이유를 모르겠습니다. 도와주세요 ㅜ
안촙 1 (280 포인트) 님이 2022년 5월 27일 질문

1개의 답변

0 추천

코드상으로는 문제 없을 것으로 보이는데, 혹시 StudyFragment에서 bundle쪽에 브레이크 포인트를 찍어서 디버깅을 해보셨나요? 프레그먼트를 호출하고 값을 읽어오는 전체코드도 보여주시면 좋을 것 같은데요.

추가로 개별적인 값을 argument로 넘기지 마시고 오브젝트를 하나 넘기세요.

public class StudyArgs implements Serializable {
    private final String db;
    private final int img;
    private final String title;
    private final String signer;

    public StudyArgs(String db, int img, String title, String signer) {
        this.db = db;
        this.img = img;
        this.title = title;
        this.signer = signer;
    }

    public String getDb() {
        return db;
    }

    public int getImg() {
        return img;
    }

    public String getTitle() {
        return title;
    }

    public String getSigner() {
        return signer;
    }
}


// Write
public static HomeFragment newInstance(StudyArgs studyArgs) {
        HomeFragment fragment = new HomeFragment();
        Bundle args = new Bundle();
        args.putSerializable(ARG_STUDY, studyArgs);
        fragment.setArguments(args);
        return fragment;
    }


// Read
if (getArguments() != null) {
        StudyArgs studyArgs = (StudyArgs) getArguments().getSerializable(ARG_STUDY);
}

 

spark (224,800 포인트) 님이 2022년 5월 27일 답변
@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.home, container, false);
        o_equalsList = new ArrayList<>();
        x_equalsList = new ArrayList<>();

        Toolbar toolbar = view.findViewById(R.id.myToolBar);
        MainActivity activity = (MainActivity) getActivity();
        activity.setSupportActionBar(toolbar);
        ActionBar actionBar = ((MainActivity) getActivity()).getSupportActionBar();
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayShowTitleEnabled(false);

        study_check("db제목", "제목", "가수", R.drawable.brust_flamexml);
        
        init1();
        init2();
        init3();
        init4();



        return view;
    }

Home 화면에서 study_check라는 함수를 이용해서 질문 드렸던 코드가 실행되구요,

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.study, container, false);
        Bundle bundle = getArguments();
        if(bundle != null) {
            db = bundle.getString("db");
            title_name = bundle.getString("title");
            singer = bundle.getString("singer");
            img = bundle.getInt("img",0);
        }
        System.out.println("확인");
        System.out.println(db);
        System.out.println(title_name);
        System.out.println(singer);
        System.out.println(img);


        study1();

        return view;
    }

Study화면에서 다음과 같이 받아오는 내용이고, study1()은 받아온 데이터로 리스트뷰 어뎁터 연결하는 함수입니다. 브레이크 포인트를 어디다가 찍어서 확인해야될지도 잘 모르겠습니다..ㅜ 걸음마단계라서 이해하기가 힘들어요 ㅜㅜ
study_check() 메소드 내부에서 FragmentManager 어떻게 사용되고 있나요? 왜 프레그먼트의 onCreateView에서 다른 프레그먼트를 호출하는지 궁금하네요. 이벤트 시점도 그렇고 프레그먼트의 네비게이션은 FragmentManager의 역할이거든요.
init1()부터 init4()에서 뭘하는지도 궁금하네요. 메소드 이름으로만 봐서는, 왜 네비게이션 코드이후에 초기화 코드가 실행되는지 의문이 들구요.
...