fragment를 이용한 viewpager에 데이터를 보내는 중에 문제

조회수 1829회

실행하면 메인액티비티 위에 바로 3개의 fragment로 이루어진 뷰페이저가 표출되는 앱 형태입니다. 페이지 별 내용은 json파싱 데이터를 받아와서 각각의 fragment에 전달하였고 페이저가 아닌 단일 fragment에서는 imageView와 textView에 전달하여 정상 표출을 확인했습니다.

다만, adapter로 viewpager를 만들어 구성하는 순간 fragment의 onCreateView가 두번씩 로드됩니다. 이로 인한 문제는 정상적으로 전달된 데이터를 기반으로 컴파일에 성공하지만, textView와 imageView에 아무런 내용이 표출되지 않고.

FragmentManager를 사용하지 않으면 onCreateView는 1회만 로드되나 textView에 setText를 하는순간 컴파일 에러가 발생하고 (NPE) 있습니다.

결국엔 액티비티에서 프래그먼트로 정보를 전달하려면 FragmentManager는 필수로 들어가야 하는 것 같은데, viewpager로 구성하자 onCreateView가 두번 호출되는 문제가 발생해 버립니다.. Log로 찍어보면 로드되는 순서에는 아무런 문제가 없고, 실제로 1개의 fragment일때는 정상 동작을 확인하였으니 viewpager로 구성될 때의 문제만 해결하면 될 것 같은데 방법을 모르겠습니다.

현재는 MainActivity에 어댑터와 함께 뷰페이저가 구성되어 있습니다.

[MainActivity]

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle(R.string.select_name);
        setContentView(R.layout.activity_main);

        pager = (ViewPager) findViewById(R.id.pager);
        pager.setOffscreenPageLimit(3);

        PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());

        SelectFragment1 selectfragment1 = new SelectFragment1();
        adapter.addItem(selectfragment1);
        SelectFragment2 selectfragment2 = new SelectFragment2();
        adapter.addItem(selectfragment2);
        SelectFragment3 selectfragment3 = new SelectFragment3();
        adapter.addItem(selectfragment3);

        pager.setAdapter(adapter);

        selectFragment1 = new SelectFragment1();
        selectFragment2 = new SelectFragment2();
        selectFragment3 = new SelectFragment3();

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.pager, selectFragment1).commit();

        fragmentTransaction.replace(R.id.pager, selectFragment2);
        fragmentTransaction.replace(R.id.pager, selectFragment3);

        if (AppHelper.requestQueue == null) {
            AppHelper.requestQueue = Volley.newRequestQueue(getApplicationContext());
        }
    }

로그를 순서대로 보면, "프래그먼트1", "onCreatView 불러옴 "프래그먼트1", "onCreatView 불러옴 (2회 발생) "프래그먼트2", "onCreatView 불러옴 "프래그먼트3", "onCreatView 불러옴 "프래그먼트1-response","불러옴 "List영역1", "불러옴" "프래그먼트2-response","불러옴 "List영역2", "불러옴" "프래그먼트3-response","불러옴 "List영역3", "불러옴"

이런식으로 찍히게 됩니다..

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 문제가 되는 코드를 올려주시면 문제를 파악하는데 도움이 될 것 같습니다. 주동혁 2018.5.29 16:34

1 답변

  •         SelectFragment1 selectfragment1 = new SelectFragment1();
            adapter.addItem(selectfragment1);
            SelectFragment2 selectfragment2 = new SelectFragment2();
            adapter.addItem(selectfragment2);
            SelectFragment3 selectfragment3 = new SelectFragment3();
            adapter.addItem(selectfragment3);
    
            pager.setAdapter(adapter);
    
            selectFragment1 = new SelectFragment1();
            selectFragment2 = new SelectFragment2();
            selectFragment3 = new SelectFragment3();
    
    

    위에서 Fragment를 생성해놓고

    왜 아래에서 또 생성하시나요?

    • 답변해주신 부분에서 원인을 찾았습니다. 객체를 생성해주면서 보니 빨간글씨로 변하길래.. 확인해보니 어댑터 페이지 설정해줄때는 fragment를 소문자로 적었고.. 트랜잭션, replace해줄때는 Fragment 대문자로 적었더군요.. 즉, 같은 fragment를 다른 객체에 넣어 두번이나 불러왔던 것이었습니다.. 그러다보니 onCreateView가 두번씩 호출되었었습니다. 정리해서 같게 통일해주니 정상적으로 동작됩니다... 도움 감사합니다. 알 수 없는 사용자 2018.5.30 18:43

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)