뷰페이저 메인에서 프래그먼트로 값 전달 질문입니다.
조회수 5617회
현재 메인에서 뷰페이저 탭레이아웃 툴바를 사용하고 있습니다. 여기서 검색을 눌렀을 때 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;
}
}
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
3 답변
-
아래 함수를 이용해보세요. 뷰페이저의 인덱스에 해당하는 프래그먼트에 접근할 수 있습니다.
public Fragment findFragmentByPosition(int position) { FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter(); return getSupportFragmentManager().findFragmentByTag( "android:switcher:" + getViewPager().getId() + ":" + fragmentPagerAdapter.getItemId(position)); }
간단한 방법은
- STab1, STab2, STab3 프래그먼트에 long 값을 받을 수 있는 함수를 만든다.
findFragmentByPosition()
함수로 얻은 프래그먼트를 STab1, STab2, STab3로 적절히 캐스팅 한다.- 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 오류가 나네요 ㅜ
-
FragmentStatePagerAdapter를 반드시 상속받아야 하는 상황이 아니라면 FragmentPagerAdapter를 상속받도록 변경한 후에 findFragmentByPosition() 함수를 아래와 같이 수정해보세요.
public Fragment findFragmentByPosition(int position) { return getSupportFragmentManager().findFragmentByTag( "android:switcher:" + viewPager.getId() + ":" + ((FragmentPagerAdapter) viewPager.getAdapter()).getItemId(position)); }
처음 올린 코드랑 같습니다. getViewPager(), getFragmentPagerAdapter() 함수만 올려주신 코드에 맞게 수정했어요.
-
(•́ ✖ •̀)
알 수 없는 사용자
- 감사합니다! 해결되었습니다. 근데 findFragmentByTag에서 프래그먼트에 tag를 단 적이 없는데 약간의 설명을 좀 해 주실 수 있을까요 이해가 잘 안되서 ㅜ kyudongPark 2016.9.27 12:56
- FragmentPagerAdapter 소스코드를 보면 내부적으로 태그를 생성합니다. https://github.com/android/platform_frameworks_support/blob/master/v4/java/android/support/v4/app/FragmentPagerAdapter.java 위 링크에서 makeFragmentName() 함수를 찾아보세요. 알 수 없는 사용자 2016.9.28 22:24
-
댓글 입력