나만의 개발노트

[안드로이드] 뷰페이저(ViewPager)_좌우 스크롤하기 본문

[안드로이드]/[안드로이드] 공부 기록

[안드로이드] 뷰페이저(ViewPager)_좌우 스크롤하기

노트포미 2023. 12. 18. 20:28

뷰페이저(ViewPager)

: 좌우 스크롤을 통해 다음 화면으로 전환되는 화면 슬라이드

뷰페이지는,

프래그먼트 여러개가 리스트뷰(ListView)처럼 선택할 수 있는 형태

   = 어댑터(adapter) 패턴을 사용함

-> 뷰페이저는 뷰를 보여주는 껍데기
     실제 데이터 관리는 어댑터(adapter)가 함


[뷰페이저(ViewPager) 사용법]

1. activity_main.xml에 <ViewPager> 추가

<최상위 Layout>
	...
	<androidx.viewpager.widget.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    ...
</최상위 Layout>

2. 뷰페이저(ViewPager)에 들어갈 프래그먼트(Fragment) 구성

: 프래그먼트(Fragment)는 xml파일과 java파일 한 쌍으로 구성되어 있다

   1) xml 파일 만들기

        : res -> layout 우클릭 -> New -> Layout resource file 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/cardview_dark_background">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="페이지1"
        android:textSize="40dp"
        android:textColor="@color/white"/>

</LinearLayout>

 

 

   2) java 파일 만들기   

      : java -> com.example.프로젝트이름 우클릭 -> New -> Java Cass

     1. Fragment 상속

     2. onCreateView 오버라이드해서 xml파일 inflate 하기

   

package com.example.myviewpager;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class Fragment1 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment1,container,false);
        return rootView;
    }
}

3. 어댑터(Adapter) 코드 작성

   1) FragmentStatePagerAdapter를 상속받는 PagerAdapter 클래스 만들기

   2) 아이템(여기서는 프래그먼트들)을 관리할 ArrayList 정의

   3) 생성자, 필수 메소드 구현

   4) 아이템을 추가할 때 사용할 메소드(addItem) 구현

class PagerAdapter extends FragmentStatePagerAdapter{
        //아이템을 관리할 리스트
        ArrayList<Fragment> items = new ArrayList<>();

        //기본 생성자
        public PagerAdapter(@NonNull FragmentManager fm) {
            super(fm);
        }

        //아이템 추가하는 메소드
        public void addItem(Fragment item){
            items.add(item);
        }

        //인덱스 값이 position인 아이템을 리턴하는 메소드
        @NonNull
        @Override
        public Fragment getItem(int position) {
            return items.get(position);
        }

        //items 수를 리턴하는 메소드
        @Override
        public int getCount() {
            return items.size();
        }
    }

4. xml에 구현한 ViewPager에 Adapter 연결

   1) Fragment1,2,3 정의

//Fragment 정의
Fragment1 fragment1 = new Fragment1();
Fragment2 fragment2 = new Fragment2();
Fragment3 fragment3 = new Fragment3();

 

   2) PagerAdapter 정의

//PagerAdapter 정의
PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());

 

 

   3) adapter에 아이템 추가 - addItem()

//adpater에 아이템 추가
adapter.addItem(fragment1);
adapter.addItem(fragment2);
adapter.addItem(fragment3);

   

 

   4) ViewPager에 adater 연결 - setAdatper()

//ViewPager에 Adapter 연결
pager.setAdapter(adapter);

#최종 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="부분 화면을\n 만들기 위한 텍스트"
        android:textSize="30dp" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

 

 

#최종 MainActivity.java

package com.example.myviewpager;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.view.View;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        //현재 페이지의 양쪽에 지속될 페이지 수 세팅
        pager.setOffscreenPageLimit(3);

        //Fragment 정의
        Fragment1 fragment1 = new Fragment1();
        Fragment2 fragment2 = new Fragment2();
        Fragment3 fragment3 = new Fragment3();

        //PagerAdapter 정의
        PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());

        //adpater에 아이템 추가
        adapter.addItem(fragment1);
        adapter.addItem(fragment2);
        adapter.addItem(fragment3);

        //ViewPager에 Adapter 연결
        pager.setAdapter(adapter);
    }

    class PagerAdapter extends FragmentStatePagerAdapter {
        //아이템을 관리할 리스트
        ArrayList<Fragment> items = new ArrayList<>();

        //기본 생성자
        public PagerAdapter(@NonNull FragmentManager fm) {
            super(fm);
        }

        //아이템 추가하는 메소드
        public void addItem(Fragment item){
            items.add(item);
        }

        //인덱스 값이 position인 아이템을 리턴하는 메소드
        @NonNull
        @Override
        public Fragment getItem(int position) {
            return items.get(position);
        }

        //items 수를 리턴하는 메소드
        @Override
        public int getCount() {
            return items.size();
        }
    }
}

 

 

#최종 fragment1,2,3.xml

*1,2,3에 따라 text와 background 변경해주기

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/cardview_dark_background">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="페이지1"
        android:textSize="40dp"
        android:textColor="@color/white"/>

</LinearLayout>

 

 

#최종 Fragment1,2,3.java

*1,2,3에 따라 inflate 하는 layout파일 변경해주기

package com.example.myviewpager;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class Fragment1 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment1,container,false);
        return rootView;
    }
}

 

 

#실행화면

 

 


[참고]

https://www.boostcourse.org/mo316/lecture/259208?isDesc=false

 

안드로이드 앱 프로그래밍

부스트코스 무료 강의

www.boostcourse.org

https://developer.android.com/reference/kotlin/androidx/viewpager/widget/ViewPager

 

ViewPager  |  Android Developers

androidx.compose.desktop.ui.tooling.preview

developer.android.com