프래그먼트로 값 전달 질문입니다.

조회수 4751회

현재 한 화면에 EditText와 검색 버튼, 3개의 탭과 뷰페이저로 구성되어 있으며 각각의 탭은 프래그먼트 입니다. 검색을 누르면 json파싱을 해서 오는 값을 탭에 있는 프래그먼트로 보내려고 하는데

메인에 있는 코드입니다.

                long id = parentJsonObject.getLong("id");
                STab1 stab1 = new STab1(); // STab1 은 프래그먼트입니다.
                Bundle bundle = new Bundle();
                bundle.putLong("id1", id);
                stab1.setArguments(bundle);

여기서 로그 찍어보면 값은 넘어가는데

밑은 프래그먼트에 있는 코드입니다.

    if(getArguments() !=null) {
        Bundle bundle = getArguments();
        long id = bundle.getLong("id1");

        Log.e("aa", "값 : " + id);
    }

여기서 값이 전달이 되지를 않습니다. 어떻게 해야 하나요 ㅜ

3 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    몇가지 확인이 필요합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 프래그먼트 3개는 미리 만들어놓고 통신을 해서 값이 오면 그것을 화면에 있는 프래그먼트에 보내는 건데 잘 안되네요 ㅜ 그리고 FragmentStatePageAdapter를 사용하고 있습니다. bundle로 값을 넘기는 건 알았는데 그냥 long id 값 하나만 넘기면 되는데 이해가 잘 안되네요 ㅜ 프래그먼트에 ID나 Tag가 따로 없어서 어떻게 해야되는지 감이 잘 안오네요 ㅜ kyudongPark 2016.9.20 10:39
    • 이미 만들어진 프래그먼트로 값을 전달하는 것이라면 세번째 방법을 사용하세요. 올려주신 setArgument()는 프래그먼트가 액티비티에 attach 되기 전에만 사용할 수 있습니다. (프래그먼트 생성 시 파라미터를 넘기기 위한 용도입니다) 알 수 없는 사용자 2016.9.20 11:49
    • 3번째 방법중에서 밑의 fragmentpagerAdapter를 사용할 때를 보고 있는데 맞나요? kyudongPark 2016.9.20 11:58
    • 일단은 아래 답변을 참고하셔서 기존 코드를 변경하는 것이 선행되어야 하고요. 그렇게 되면 FragmentPagerAdapter(혹은 FragmentStatePagerAdapter)를 사용해서 구현하게 될 것입니다. 그 때 세번째 방법의 FragmentPagerAdapter 상황을 참고하세요. 알 수 없는 사용자 2016.9.20 13:59
  • 최근 올려주신 질문에 대한 답변을 작성하고 있었는데, 질문이 삭제되어서요. 혹시 해결하지 못했다면 아래 내용 참고하세요.

    첫번째 코드 블럭에서 색상 버튼 클릭 시 onColorClick() 에서 프래그먼트를 매번 새로 생성하는 것 같은데 의도된 코드인가요? 이렇게 되면 프래그먼트가 새로 생성되기 때문에 기존 상태를 유지할 수 없습니다. 탭을 클릭할 때 마다 리셋된다는 현상은 이 부분 때문에 발생하는 것이고요.

    올려주신 UI는 TabLayout을 사용하면 어렵지 않게 구현할 수 있습니다. 아래 링크들을 참고하셔서 코드를 수정해보세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 밑에 답변으로 하나 달겠습니다.ㅜ kyudongPark 2016.9.23 11:49
  • 현재 메인에서 뷰페이저 탭레이아웃 툴바를 사용하고 있습니다. 여기서 검색을 눌렀을 때 SearchAsyncTask을 시행합니다. 그러면 SearchAsyncTask의 onPostExecute에서 long값을 하나 얻어내면 이 long값을 각각의 탭("ㄹㄹ") 프래그먼트로 보내서 프래그먼트에서 다른 AsyncTask를 하려고 합니다. 그런데 long값을 뷰페이저속의 프래그먼트로 어떻게 보내야 하는지를 링크들을 봐도 잘 모르겟네요 ㅜ

    이건 메인코드입니다.

        searchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = inputName.getText().toString();
                new SearchAsyncTask(name).execute("유알엘");
            }
        });
    
        toolbar = (Toolbar) findViewById(R.id.searchToolbar);
        setSupportActionBar(toolbar);
        toolbar.setTitle("검 색");
    
        tabLayout = (TabLayout) findViewById(R.id.searchTabLayout);
        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.searchViewPager);
        SearchViewPagerAdapter adapter = new SearchViewPagerAdapter(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) {
    
            }
        });
    

    이건 메인함수 속의 뷰페이저 어댑터입니다. long 값을 어떻게 보내줘야 하나요 ㅜ

    private class SearchViewPagerAdapter extends FragmentStatePagerAdapter {
    
        int tabCount;
    
        public SearchViewPagerAdapter(FragmentManager fm, int tabCount) {
            super(fm);
            this.tabCount = tabCount;
        }
    
        @Override
        public Fragment getItem(int position) {
    
            switch (position) {
                case 0:
                    return new STab1();
                case 1:
                    return new STab2();
                case 2:
                    return new STab3();
                default:
                    return null;
            }
        }
    
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
    
            switch (position) {
                case 0:
                    sTab1 = (STab1) createdFragment;
                    break;
                case 1:
                    sTab2 = (STab2) createdFragment;
                    break;
                case 2:
                    sTab3 = (STab3) createdFragment;
                    break;
            }
            return createdFragment;
        }
    
        @Override
        public int getCount() {
            return tabCount;
        }
    }
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)