<뷰페이저 만들기>
뷰페이저 : 손가락으로 좌우 스크롤하여 넘겨볼 수 있는 기능
안에 프래그먼트를 넣을 수 있고, 좌우 스크롤로 프래그먼트를 전환하는 형식이다.
어댑터를 사용함.
구현할 것 :
1. 뷰페이저
2. '처음으로' 버튼 : 누르면 첫 화면으로 이동
3. 페이지 구분하는 상단 탭
※ 책에서는 ViewPager를 사용했지만, 현재 안드로이드 스튜디오에서는 ViewPager가 사라지고 ViewPager2만 남았기 때문에 ViewPager2를 사용한 코드를 작성했다. (그래서 책이랑 코드가 좀 다르다.)
1. activity_main
이런 식으로 배치한다. (책에서는 뷰페이저 안에 타이틀스트립을 넣는 방식으로 구현했으나, 안드로이드 스튜디오가 업데이트되면서 뷰페이저가 사라지고 뷰페이저2가 생겼다. 뷰페이저2에는 타이틀스트립을 넣을 수 없어서 그냥 상단탭을 넣는 것으로 대체했다.)
<activity_main.xml>
위처럼 배치해준 다음 그냥 TabLayout이랑 ViewPager2에다 id 값만 tablayout, pager로 넣어준다.
2. <MainActivity.java>
package com.example.chapter5_5;
public class MainActivity extends AppCompatActivity {
ViewPager2 pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 뷰페이저
pager = findViewById(R.id.pager);
pager.setOffscreenPageLimit(3);
MyPagerAdapter adapter = new MyPagerAdapter(this);
Fragment1 fragment1 = new Fragment1();
adapter.addItem(fragment1);
Fragment2 fragment2 = new Fragment2();
adapter.addItem(fragment2);
Fragment3 fragment3 = new Fragment3();
adapter.addItem(fragment3);
pager.setAdapter(adapter);
// 버튼
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pager.setCurrentItem(0); // items[0] 으로 이동
}
});
// 타이틀스트립 대체 (뷰페이저1에서만 되는거..라서 따로 코드 짬)
TabLayout tabLayout = findViewById(R.id.tablayout);
new TabLayoutMediator(tabLayout, pager, (tab, position) -> {
tab.setText("페이지 " + position); // 각 탭 제목 설정
}).attach();
}
class MyPagerAdapter extends FragmentStateAdapter {
ArrayList<Fragment> items = new ArrayList<Fragment>();
public MyPagerAdapter(AppCompatActivity activity){
super(activity);
}
public void addItem(Fragment item){
items.add(item);
}
@NonNull
@Override
public Fragment createFragment(int position) {
return items.get(position);
}
@Override
public int getItemCount() {
return items.size();
}
}
}
2 - (1) MyPagerAdapter 클래스 만들기
class MyPagerAdapter extends FragmentStateAdapter {
ArrayList<Fragment> items = new ArrayList<Fragment>();
FragmentStateAdapter를 상속받는다.
Fragment 객체가 들어가는 ArrayList 객체를 선언함. (items)
public MyPagerAdapter(AppCompatActivity activity){
super(activity);
}
새로 만든 어댑터가 뭐.. 대충 부모의 액티비티를 상속받는다? 뭐 그런거 (아직도 잘 이해 안감)
public void addItem(Fragment item){
items.add(item);
}
addItem이라는 메서드를 새로 만든다. 입력받은 프래그먼트를 items에 넣는다.
@Override
public Fragment createFragment(int position) {
return items.get(position);
}
createFragment 메서드를 재정의한다. 입력받은 값(위치)의 프래그먼트를 return 한다.
@Override
public int getItemCount() {
return items.size();
}
getItemCount 메서드를 재정의한다. items 배열의 크기를 return 한다.
2 - (2) 위에서 만든 클래스의 함수를 사용하여 뷰페이저 설정하기
pager = findViewById(R.id.pager);
pager.setOffscreenPageLimit(3);
MyPagerAdapter adapter = new MyPagerAdapter(this);
Fragment1 fragment1 = new Fragment1();
adapter.addItem(fragment1);
Fragment2 fragment2 = new Fragment2();
adapter.addItem(fragment2);
Fragment3 fragment3 = new Fragment3();
adapter.addItem(fragment3);
pager.setAdapter(adapter);
setOffscreenPageLimit(3)으로 뷰페이저의 최대 페이지 수(3)를 설정한다.
fragment 1,2,3을 각각 생성한 뒤 adapter.addItem으로 items에 넣어준다.
pager.setAdapter로 어댑터 객체가 설정되고, 이 때부터 뷰페이저는 어댑터에 있는 프래그먼트들을 화면에 보여줄 수 있게 된다.
2 - (3) '처음으로' 버튼 만들기
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pager.setCurrentItem(0); // items[0] 으로 이동
}
});
pager.setCurrentItem(n) 메서드를 사용하여, 버튼을 누르면 n번째 페이지로 이동한다.
2 - (4) 상단탭 배치
TabLayout tabLayout = findViewById(R.id.tablayout);
new TabLayoutMediator(tabLayout, pager, (tab, position) -> {
tab.setText("페이지 " + position); // 각 탭 제목 설정
}).attach();
TabLayoutMediator로 java 코드에서 탭의 상세 정보들을 변경할 수 있는 듯.
3. 실행 결과
아래와 같이 오른쪽으로 넘기면 다음 프래그먼트가 나타나는 것을 확인할 수 있다.
('처음으로' 버튼이랑 상단 탭은 실행화면 캡쳐 안함)
'TIL > 안드로이드 스튜디오' 카테고리의 다른 글
도전!9 - 고객 정보 입력 화면의 구성 (0) | 2024.12.24 |
---|---|
5장 바로가기 메뉴(NavigationDrawer) 만들기 (0) | 2024.12.23 |
5장 상단 탭과 하단 탭 만들기 (0) | 2024.12.20 |
5장 - 액션바 사용하기 (0) | 2024.12.19 |
5장 - 프래그먼트 수명주기 & 분할화면 만들기 (0) | 2024.12.16 |