뷰페이저 메인에서 프래그먼트로 값 전달 질문입니다.


현재 메인에서 뷰페이저 탭레이아웃 툴바를 사용하고 있습니다. 여기서 검색을 눌렀을 때 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;
    }
}
  • 2016년 09월 26일에 수정됨
  • 2016년 09월 25일에 작성됨
    지금 공익근무 중이고 안드로이드를 공부하고 있습니다.

조회수 192


3 답변


아래 함수를 이용해보세요. 뷰페이저의 인덱스에 해당하는 프래그먼트에 접근할 수 있습니다.

public Fragment findFragmentByPosition(int position) {
    FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter();
    return getSupportFragmentManager().findFragmentByTag(
            "android:switcher:" + getViewPager().getId() + ":"
                    + fragmentPagerAdapter.getItemId(position));
}

간단한 방법은

  1. STab1, STab2, STab3 프래그먼트에 long 값을 받을 수 있는 함수를 만든다.
  2. findFragmentByPosition() 함수로 얻은 프래그먼트를 STab1, STab2, STab3로 적절히 캐스팅 한다.
  3. long 값을 받을 수 있는 함수를 호출한다.

findFragmentByPosition() 함수를 사용하면 아래와 같은 모양으로 코드가 작성되겠네요.

STab1 fragment = (STab1) findFragmentByPosition(0);
fragment.setXXX(long);

  • 메인에서 findFragmentByPosition메소드를 만들었는데 getFragmentPagerAdapter(); 와 getViewPager()은 뭘 뜻하는거죠? 함수가 없습니다. 그리고 저 Tag는 프래그먼트에서 태그를 설정하고 하는 것인가요?     kyudongPark   2016.9.26 09:49     

현재 postExecute에서

     @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        prd.dismiss();
        try {
            JSONObject parentJsonObject = new JSONObject(result);

            long responseCode = parentJsonObject.getLong("responseCode");

            if(responseCode == 33) {
                long id = parentJsonObject.getLong("id");
                STab3 fragment = (STab3) findFragmentByPosition(2);
                fragment.setLong(id);
                //someMethod(id);
            } else if(responseCode == 34) {
                Toast.makeText(SearchHwamyun.this, "닉네임이 존재하지 않습니다!", Toast.LENGTH_SHORT).show();
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

이건 메인에서 만든 함수입니다.

public Fragment findFragmentByPosition(int position) {
    FragmentStatePagerAdapter asdf = adapter;
    return getSupportFragmentManager().findFragmentByTag(
            "android:switcher:" + viewPager.getId() + ":" +
                    asdf.getItem(position));
}

프래그먼트에서는 이렇게 함수를 만들었는데

public long setLong(long asdf) {
    asd = asdf;
    return asd;
}

postExecute에서 nullPointerException 오류가 나네요 ㅜ

  • 2016년 09월 26일에 작성됨
    지금 공익근무 중이고 안드로이드를 공부하고 있습니다.


FragmentStatePagerAdapter를 반드시 상속받아야 하는 상황이 아니라면 FragmentPagerAdapter를 상속받도록 변경한 후에 findFragmentByPosition() 함수를 아래와 같이 수정해보세요.

public Fragment findFragmentByPosition(int position) {
    return getSupportFragmentManager().findFragmentByTag(
            "android:switcher:" + viewPager.getId() + ":"
                    + ((FragmentPagerAdapter) viewPager.getAdapter()).getItemId(position));
}

처음 올린 코드랑 같습니다. getViewPager(), getFragmentPagerAdapter() 함수만 올려주신 코드에 맞게 수정했어요.


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close