프래그먼트 한번 보고 보기(아무 상관 없지만 걍)
(각각의 프래그먼트 안에는 레이아웃으로 화면을 구성 할 수 있음)
↓
뷰페이저 (뷰페이지 안에는 여러개의 프래그먼트로 구성할 수 있음)
(예 - 각각의 영화포스터가 프래그먼트에 보이도록하고
이 프래그먼트를 뷰페이저에 추가하면
영화목록을 만들 수가 있게 된다.)
↓
바로가기메뉴(네비게이션드로어)
-참고-
뷰페이저와 바로가기메뉴를 만든다면 코드가 상당히 많아진다. 왜냐하면 프래그먼트를 사용하기 때문이다.
근데 프래그먼트를 사용하면 수정할 일이 생기면 각각의 프래그먼트를 기능별로 수정할 수가 있어서 장점이 많다.
뷰페이저란?
손가락으로 "좌우 스크롤"하면 하나의 뷰페이저 안에 들어가 있는 한 단위의 화면이 오른쪽으로 넘어가게 된다.
"좌우 스크롤"을 통해서 화면을 넘기는 기능.
만약,
뷰페이저가
"화면 전체"를 덮고 있으면 화면이라고 할 수 있고,
"화면의 일부분"을 채우고 있으면, "부분화면"이 넘어간다라고 할 수 있다.
"부분화면"이라고 하면 프래그먼트를 사용하는 것이 일반적이다.
즉, 뷰페이저 안에 여러개의 "부분화면"이 들어갈 수 있다는 말이다.
그리고,
그 "부분화면"을 구성하는게 프래그먼트이다라고 할 수 있다.
뷰페이저 안에 들어가는 것이 하나가 아니라 프래그먼트가 여러개의 "부분화면"으로써
들어가는 거니깐
여러개의 아이템 중에서 하나를 선택하는 형태가 됩니다.(=1.여러개에서 선택하는게 "선택위젯"하고, 2.리스트뷰처럼 여러개 중에 하나를 선택하는 거는 어댑터를 사용 해야 한다)
그래서,
뷰페이저도 똑같이 "어댑터 패턴"을 사용하게 됩니다.
"어댑터"라는게 실제 데이터를 관리하고, 각각의 뷰를 만들어 주는데,
그러면 결국에는 뷰페이저는 껍데기 역할만 하는거다.(xml 레이아웃에 보이는 거는 뷰페이저가 한다)
실제 데이터는 "어댑터"가 담당한다.
뷰페이저 안에 들어가는게 프래그먼트이다.
"어댑터"가 프래그먼트를 관리한다라고 생각 할 수 있다.
1. 전체 구조
뷰 - activity6_main.xml, frag6_1.xml, frag6_2.xml, frag6_3.xml
처리 - Activity6.java, Fragment6_1.java, Fragment6_2.java, Fragment6_3.java
2. 메인 액티비티
// 프래그먼트 매니저를 받아서 초기화해주는 생성자 코드
public MoviePagerAdapter(FragmentManager fm) {
super(fm);
}
getItem() : 각각의 item객체를 리턴 해줌. - @Override
getCount() : 어댑터 안에 들어가 있는 item의 갯수 - @Override
addItem(Fragment item) : 리스트에 item 추가 - 만든거
3. 메인 액티비티
pager 안에 들어가 있는 item이 Fragment이기 때문에 Fragment가 화면에 보이는 거잖아요.
근데,
어떤 View나 Fragment나 등등, 이런 것들이 화면에 보이지 않는 경우가 있는데!!...
음..
예를 들어,
100개의 Fragment가 있는데, 그 중에 6개만 화면 상에 보이는 경우에,
스크롤을 해도 6개만 보이는 경우에,
나머지 994개는 캐싱을 해놓게 됩니다.
"캐싱을 해놓을 그 프래그먼트 나머지 item의 갯수가 몇개냐?"라는 것을 지정을 할 수가 있는데요!!
근데 그게 기본은 3개보다 적게 되어있어요, 그래서 setOffscreenPageLimit()라고 하는 것으로, 3으로 늘려주고,
뒤에 캐싱하는게 3개까지 늘려줍니다, 그래서 미리 뒤에 보여줄 Fragment들을 담아 놓고, 그 상태에서 스크롤 할 때 보여 주게 됩니다.
다른 설명으로 한 번 더 설명,
Fragment로 ViewPager를 구현할 때 호출되는 페이지 로딩은 현재 페이지의 전후가 됩니다.
그런데 로딩 시간이 길다보니 나머지 페이지도 미리 로딩하고 싶을 때 setOffscreenPageLimit()이 쓰인다.
setOffscreenPageLimit()의 파라미터 값으로 보여질 페이지 수 -1개를 넣어주면 되며,
예를 들어 5개의 페이지를 미리 로딩하고 싶으면 아래와 같이 사용하면 됩니다.
paper.setOffscreenPgeLimit(4);
4. 메인 액티비티(뷰페이저, 어댑터 연결 하기)
5. 결과
(옆으로 스크롤하면서 결과 확인하면 됩니다.)
6. 전체 코드
뷰 - activity6_main.xml, frag6_1.xml, frag6_2.xml, frag6_3.xml
처리 - Activity6.java, Fragment6_1.java, Fragment6_2.java, Fragment6_3.java
- activity6_main.xml
- frag6_1.xml (= frag6_2.xml, frag6_3.xml)
- Activity6.java
public class Activity6 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity6_main);
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setOffscreenPageLimit(3);
MoviePagerAdapter adapter = new MoviePagerAdapter(getSupportFragmentManager());
Fragment6_1 f1= new Fragment6_1();
Fragment6_2 f2= new Fragment6_2();
Fragment6_3 f3= new Fragment6_3();
adapter.addItem(f1);
adapter.addItem(f2);
adapter.addItem(f3);
pager.setAdapter(adapter);
}
class MoviePagerAdapter extends FragmentStatePagerAdapter{
ArrayList<Fragment> items = new ArrayList<Fragment>();
public MoviePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) { // 아이템 리턴
return items.get(i);
}
@Override
public int getCount() {
return items.size();
}
// 추가
public void addItem(Fragment item){
items.add(item);
}
}
}
- Fragment6_1.java ( = Fragment6_2.java, Fragment6_3.java)
'■ Android > Tip' 카테고리의 다른 글
[Android] 네비게이션드로어 메뉴(바로가기 메뉴 = 옆메뉴) - 1.사용법, 설명 (0) | 2020.02.03 |
---|---|
[Android] 뷰페이저(ViewPager) - 2.타이틀스트립 사용법 (0) | 2020.02.02 |
[Android] 탭(Tab) - 2. (0) | 2020.02.01 |
[Android] 탭(Tab) - 1.구조(액션바 하단에 탭(Tab) 붙이기 + CoordinatorLayout) (0) | 2020.01.31 |
[Android] 프래그먼트(Fragment) - (6)실습(왼쪽의 리스트에서 하나 선택하면 오른쪽에 이미지 보기) (0) | 2020.01.29 |