728x90

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/



'안드로이드 > Layout' 카테고리의 다른 글

CardView tools:visibility  (0) 2021.08.12
android 검색 + 버튼 배치  (0) 2021.03.14
하단 TabLayout + ViewPager Layout 예제  (0) 2020.11.01
LinearLayout 예제  (0) 2020.10.13
LinearLayout 동적 생성  (0) 2020.10.01
블로그 이미지

Link2Me

,