https://link2me.tistory.com/1898 게시글은 ViewPager와 Fragment 함께쓰기 예제에 대한 사항이다.
동일 코드 중심으로 ViewPager2 와 Fragment 함께쓰기로 변경했을 경우에 대한 사항을 적어둔다.
https://developer.android.com/training/animation/vp2-migration?hl=ko 게시글을 먼저 읽어보면 도움된다.
기존의 ViewPager 와 변경된 점은 RTL 슬라이딩(좌에서 우로) 지원, 수직방향 슬라이드 지원, 기존 ViewPager의 notifyDataSetChanged 버그 문제해결, offscreenPageLimit를 통한 뷰 계층에 저장된 뷰나 프레그먼트를 제어할 수 있다.
Fragment를 사용하기 위해 FragmentPagerAdapter나 FragmentStatePagerAdapter대신 FragmentStateAdapter를 사용해야 한다.
Layout 에서의 변경사항

앱 build.gradle 추가사항
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.google.android.material:material:1.2.1' // ViewPager2 implementation 'androidx.viewpager2:viewpager2:1.0.0' implementation 'gun0912.ted:tedpermission:2.0.0' } |
ViewPagerActivity.java 변경사항
기존 ViewPager 코드
private ViewPager mViewPager; private MyViewPagerAdapter myPagerAdapter; private TabLayout tabLayout; @Override protected void onCreate(Bundle savedInstanceState) {
Fragment frag1 = new HomeFragment().newInstance(code,""); Fragment frag2 = new WebviewFragment().newInstance(code,"https://m.naver.com"); Fragment frag3 = new AddressFragment().newInstance(code);
mViewPager = findViewById(R.id.viewPager); tabLayout = findViewById(R.id.tab_layout); mViewPager.setOffscreenPageLimit(5);
myPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager()); myPagerAdapter.addFrag(frag1,"Home"); myPagerAdapter.addFrag(frag2,"공지"); myPagerAdapter.addFrag(frag3,"지도");
mViewPager.setAdapter(myPagerAdapter); tabLayout.setupWithViewPager(mViewPager); }
|
ViewPager2 코드
private ViewPager2 mViewPager; private MyViewPagerAdapter myPagerAdapter; private TabLayout tabLayout;
private String[] titles = new String[]{"리스트", "웹뷰", "연락처"};
@Override protected void onCreate(Bundle savedInstanceState) {
Fragment frag1 = new HomeFragment().newInstance(code,""); Fragment frag2 = new WebviewFragment().newInstance(code,"https://m.naver.com"); Fragment frag3 = new AddressFragment().newInstance(code);
mViewPager = findViewById(R.id.viewPager); tabLayout = findViewById(R.id.tab_layout);
myPagerAdapter = new MyViewPagerAdapter(this); myPagerAdapter.addFrag(frag1); myPagerAdapter.addFrag(frag2); myPagerAdapter.addFrag(frag3);
mViewPager.setAdapter(myPagerAdapter);
//displaying tabs new TabLayoutMediator(tabLayout, mViewPager, (tab, position) -> tab.setText(titles[position])).attach(); } |
MyViewPagerAdapter.java
public class MyViewPagerAdapter extends FragmentStateAdapter { private final List<Fragment> mFragmentList = new ArrayList<>();
public MyViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); }
public void addFrag(Fragment fragment) { mFragmentList.add(fragment); }
@NonNull @Override public Fragment createFragment(int position) { // Fragment 교체를 보여주는 처리 구현 return mFragmentList.get(position); }
@Override public int getItemCount() { // ViewPager 로 보여줄 View의 전체 개수 return mFragmentList.size(); }
}
|
전체 코드는 https://github.com/jsk005/JavaProjects/tree/master/viewpager2 에 올려 두었다.
참고하면 도움되는 자료
https://www.androidhive.info/2020/01/viewpager2-pager-transformations-intro-slider-pager-animations-pager-transformations/