메인에서 프래그먼트로 값을 전달할 때 질문입니다.

조회수 2705회

메인에서 어떤 String 값을 intent를 통해서 2번째화면으로 보냈습니다. 2번째화면에서는 3개의 탭과 뷰페이저를 이용하고 있고 각각의 탭은 프래그먼트로 이루어져 있습니다. 그런데 2번째화면에서 버튼을 클릭한다던지 그럴 때에는 메인에서 넘어온 String값을 다시 프래그먼트로 넘겨주는게 가능한데, 클릭이벤트나 무슨 이벤트가 없으면 메인에서 넘어온 String값이 프래그먼트로 넘어가지를 않습니다. 무슨 문제일까요?

    Intent intent = getIntent();
    if(intent != null) {
        token = intent.getStringExtra("token");
        uid = intent.getStringExtra("uid");
        client = intent.getStringExtra("client");

        if(tab1 != null) {
            tab1 = (FirstTabFragment) findFragmentByPosition(0);
            tab1.setAuth(token, uid, client);
        }

        Log.e("fff", "aa - " + token);
        Log.e("fff", "aa - " + uid);
        Log.e("fff", "aa - " + client);

        //asdfa(token, uid, client);
    }

2번째화면에서 이런식으로 하면 프래그먼트로 값이 넘어가지가 않습니다.

    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(tab1 != null) {
                tab1 = (FirstTabFragment) findFragmentByPosition(0);
                tab1.setAuth(token, uid, client);
            }
        }
    });
}

그런데 이런식으로 2번째화면에서 임의의 버튼을 생성한뒤 클릭할 때 넘겨주면 프래그먼트에 넘어간 것을 확인했습니다. 그런데 저는 메인에서 2번째화면으로 String값이 넘어온 뒤 바로 프래그먼트로 넘겨주려고 합니다. 버튼같은 것을 클릭하지 않고요.

어떻게 해야할까요 ㅜ

  • 첫번째 코드 블럭에서 if(tab1 != null) 내의 코드가 실행되는 것은 혹시 확인하셨나요? 알 수 없는 사용자 2016.10.24 23:07
  • 음 실행되지 않는 것 같습니다. 똑같이 했는데 두번째 코드에서만 실행이 되고 값이 넘어갔습니다. kyudongPark 2016.10.24 23:40
  • 첫번째랑 두번째 코드에서 저는 차이가 이벤트를 주고 아니고의 차이인 것 같은데 왜 첫번째에서는 실행이 되지 않는지를 모르겠습니다 ㅜ kyudongPark 2016.10.24 23:41
  • 첫번째 코드 블럭의 if(tab1 != null)이 실행되지 않았다는 것은 해당 시점에 tab1 프래그먼트가 아직 생성되기 전이거나 프래그먼트는 생성됐지만 tab1에 아직 할당이 되지 않았기 때문으로 보입니다. 첫번째 코드 블럭이 실행되는 시점에 프래그먼트가 생성됐는지 또는 tab1에 실제 프래그먼트가 아닌 왜 null이 들어있는지를 살펴보세요. 알 수 없는 사용자 2016.10.25 00:11
  • 프래그먼트가 할당이 되려면 이벤트가 필요한가요? kyudongPark 2016.10.25 00:27
  • 이런식으로 어댑터를 짯습니다. kyudongPark 2016.10.25 00:27
  • 이벤트가 필요하다기보다 뷰페이저의 setAdapter를 해야 프래그먼트가 생성되는데요. 시점 상 첫번째 코드블럭이 프래그먼트가 생성된 이후에 실행되는게 맞는지 로그나 코드 리뷰를 통해서 파악하는게 필요해보입니다. 그리고 올려주신 코드에서는 tab1 변수에 최초로 값이 할당되는 시점이 보이지 않는데요. if (tab != null) 블럭의 코드가 실행되는 조건이 True가 될 수 있는 상황이 존재하는지 확인이 필요합니다. 알 수 없는 사용자 2016.10.25 09:07
  • 맨위에서 FirstTabFragment tab1; 이렇게 정의를 했습니다. 데이터가 넘어오면 getIntent부터 시작이 되어서 그 안에 setadpater나 뷰페이저 탭레이아웃 관련된 코드를 넣은 후에도 tab1 이 null이 되네요 ㅜ. 그런데 왜 버튼같은 걸 클릭하면 null 되지 않는지를 모르겠습니다. 밑에 수정한 코드를 첨부했습니다. kyudongPark 2016.10.25 09:54
  • onTabSelected나 Reselected에 if(tab1!=null)을 넣으면 화면에 가서 탭을 눌러야지 tab1이 생성이 됩니다. tab1이 생성되는 조건이 setAdapter를 하면 생성되는 것 아닌가요..? 왜 이벤트를 하면 되고 안하면 안되는지 이해가 잘 안가네요. ㅜ kyudongPark 2016.10.25 10:02
  • 뷰페이저의 setAdapter를 호출한 뒤에 프래그먼트가 동기적으로 생성된다고 이해하고 계신 것 같은데요. 이는 잘못된 이해입니다. 프래그먼트의 트랜잭션이 커밋되면 UI 쓰레드의 대기열에 작업이 추가되고, 가능한 빠른 시점에 이 작업이 수행됩니다. 즉, 동기적으로 프래그먼트 트랜잭션이 실행되는 것이 아니기 때문에 아래 코드에서 tab1 == null이 되는 것입니다. 알 수 없는 사용자 2016.10.25 11:35
  • 그럼 메인에서 intent로 값을 받아오고 바로 프래그먼트로 넘겨줄 수는 없는 건가요? kyudongPark 2016.10.25 14:58

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    현재 코드에서 가장 간단한 방법은 FirstTabFragment에서 다음과 같이 직접 액티비티의 인텐트 정보를 가져오는 것일듯 합니다.

    String token = getActivity().getIntent().getStringExtra("token");
    String uid = getActivity().getIntent().getStringExtra("uid");
    String client = getActivity().getIntent().getStringExtra("client");
    

    위 코드를 프래그먼트의 onCreateView()와 같은 함수에 추가해서 값이 제대로 전달되는지 확인해보세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • private FirstTabFragment tab1;
    private SecondTabFragment tab2;
    private ThirdTabFragment tab3;
    
    
    
        Intent intent = getIntent();
        if(intent != null) {
            token = intent.getStringExtra("token");
            uid = intent.getStringExtra("uid");
            client = intent.getStringExtra("client");
    
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            toolbar.setTitle("게 시 판");
    
            tabLayout = (TabLayout) findViewById(R.id.tab_layout);
            tabLayout.addTab(tabLayout.newTab().setText(""));
            tabLayout.addTab(tabLayout.newTab().setText(""));
            tabLayout.addTab(tabLayout.newTab().setText(""));
            tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    
            viewPager = (ViewPager) findViewById(R.id.viewpager);
            adapter = new ViewPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
            viewPager.setAdapter(adapter);
            viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
            viewPager.setOffscreenPageLimit(3);
    
            tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    viewPager.setCurrentItem(tab.getPosition());
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
    
            if(tab1 != null) {
                tab1 = (FirstTabFragment) findFragmentByPosition(0);
                tab1.setAuth(token, uid, client);   
            }
    
            Log.e("fff", "aa - " + token);
            Log.e("fff", "aa - " + uid);
            Log.e("fff", "aa - " + client);
        }
    

    이런식으로 코드를 수정했는데도 되지를 않습니다(tab1 == null)입니다. 그런데 버튼을 클릭하면 tab1 != null이 됩니다. 뭘 잘못한거일까요..

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

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

(ಠ_ಠ)
(ಠ‿ಠ)