탭을 표시하는 방법을 살펴본다.
어댑터 뷰 단원에서 어댑터 뷰(ListView, GridView)의 항목에 표시될 정보를 Adapter 객체를 통해서 얻었듯이, ViewPager2는 FragmentStateAdapter 객체를 통해서 각 페이지에 표시될 정보를 제공 받습니다.
ViewPager2를 사용하기 위해서는 다음 의존성을 app/build.gradle 파일에 추가해야 함
dependencies {
...
implementation 'androidx.viewpager2:viewpager2:1.0.0'
}
FragmentStateAdapter를 이용한 ViewPager2 사용 예제 구현은 다음과 같은 절차로 진행됩니다.
ViewPagerTest 안드로이드 프로젝트를 생성하고, 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">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vpPager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
FirstFragment (Java 코드)
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false);
}
}
fragment_first.xml (XML 레이아웃)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
tools:context=".FirstFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="FirstFragment 페이지 입니다."
android:textAppearance="?android:attr/textAppearanceLarge" />
</FrameLayout>
FragmentStateAdapter를 재정의하여 몇 개의 페이지가 존재하며, 각 페이지를 나타내는 프래그먼트가 무엇인지를 정의합니다.
public class PagerAdapter extends FragmentStateAdapter {
private static int NUM_ITEMS=3;
public PagerAdapter(FragmentActivity fa) {
super(fa);
}
// 각 페이지를 나타내는 프래그먼트 반환
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
FirstFragment first = new FirstFragment();
return first;
case 1:
SecondFragment second = new SecondFragment();
return second;
case 2:
ThirdFragment third = new ThirdFragment();
return third;
default:
return null;
}
}
// 전체 페이지 개수 반환
@Override
public int getItemCount() {
return NUM_ITEMS;
}
}
이제, MainActivity 클래스의 onCreate() 메소드에서 ViewPager 객체에 앞서 정의한 PagerAdapter 객체를 설정합니다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager2 vpPager = findViewById(R.id.vpPager);
FragmentStateAdapter adapter = new PagerAdapter(this);
vpPager.setAdapter(adapter);
}
}
getCurrentItem(): ViewPager2 객체의 현재 페이지를 반환
vpPager.getCurrentItem(); // --> 2
setCurrentItem(int item): ViewPager2 객체의 현재 페이지를 설정
vpPager.setCurrentItem(2)
registerOnPageChangeCallback(ViewPager2.OnPageChangeCallback callback): ViewPager2 객체의 페이지 변화가 일어날 때, 특정한 일을 처리해 주기 위해서 사용
// Attach the page change listener inside the activity
vpPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
Toast.makeText(MainActivity.this,
"Selected page position: " + position, Toast.LENGTH_SHORT).show();
}
});
실행화면
app/build.gradle 파일에 다음 의존성을 추가
dependencies {
...
implementation 'com.google.android.material:material:1.1.0'
}
XML 레이아웃에서 ViewPager 위젯의 자식뷰로 com.google.android.material.tabs.TabLayout을 추가 (PagerTabStrip 위젯은 제거)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vpPager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
다양한 TablLayout의 속성 값을 커스터마이징 할 수 있습니다.
Name | Options | Description |
---|---|---|
tabBackground | @drawable/image | Background applied to the tabs |
tabGravity | center, fill | Gravity of the tabs |
tabIndicatorColor | @color/blue | Color of the tab indicator line |
tabIndicatorHeight | @dimen/tabh | Height of the tab indicator line |
tabMaxWidth | @dimen/tabmaxw | Maximum width of the tab |
tabMode | fixed, scrollable | Small number of fixed tabs or scrolling list |
tabTextColor | @color/blue | Color of the text on the tab |
사전 준비
TabLayoutMediator는 TabLayout을 ViewPager2로 연결시켜 주는 역할을 함
protected void onCreate(Bundle savedInstanceState) {
//...
// create a TabLayoutMediator to link the TabLayout to the ViewPager2, and attach it
new TabLayoutMediator(tabLayout, vpPager,
new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
// 탭에 표시될 제목을 PagerAdapter 클래스의 getPageTitle(int) 메소드로부터 공급 받아 설정
tab.setText(((PagerAdapter)adapter).getPageTitle(position));
}
}
).attach();
//...
}
실행 화면
전체 프로젝트 코드 (Github 저장소 위치)
Google Play Style Tabs using TabLayout 자료에는 다음과 같은 작업을 수행하는 방법을 공부할 수 있습니다.
TabLayout의 탭에 Icon 설정 | TabLayout의 탭에 Icon+Text 설정 |
---|---|