Trang chủHướng dẫnHướng dẫn và ví dụ về ViewPager trong Android
Chuyên gia

Hướng dẫn và ví dụ về ViewPager trong Android

CyStack blog 4 phút để đọc
CyStack blog31/07/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 4 minutes

ViewPager trong Android cho phép người dùng vuốt sang trái hoặc phải để chuyển qua các trang dữ liệu. Trong ứng dụng Android ViewPager, chúng ta sẽ triển khai một ViewPager cho phép vuốt qua ba view khác nhau, mỗi view sẽ hiển thị hình ảnh và văn bản riêng biệt.

ViewPager trong Android

Android ViewPager

ViewPager là một widget có trong support library của Android, cho phép người dùng vuốt sang trái hoặc phải để chuyển sang một màn hình hoàn toàn mới.

Trong hướng dẫn này, chúng ta sẽ triển khai ViewPager bằng cách sử dụng Views kết hợp với PagerAdapter. Mặc dù cũng có thể triển khai tương tự bằng cách dùng Fragments, nhưng nội dung đó sẽ được trình bày trong một hướng dẫn khác.

ViewPager sử dụng một lớp PagerAdapter, có nhiệm vụ cung cấp các view cho MainActivity, tương tự như cách mà ListAdapter hoạt động với ListView.

->> Bài viết liên quan: Truyền dữ liệu giữa các fragment trong Android

Ví dụ về Android ViewPager

Android ViewPager

Mã ví dụ về Android ViewPager

Tệp activity_main.xml chỉ chứa một thành phần duy nhất là ViewPager, như được hiển thị dưới đây:

<RelativeLayout xmlns:android="<https://schemas.android.com/apk/res/android>"
    xmlns:tools="<https://schemas.android.com/tools>"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

Dưới đây là nội dung của tệp MainActivity.java

package com.journaldev.viewpager;

import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

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

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new CustomPagerAdapter(this));
    }
}

Vai trò của MainActivity trong đoạn mã trên chỉ đơn giản là tham chiếu đến ViewPager và thiết lập một CustomPagerAdapter kế thừa từ lớp PagerAdapter.

Trước khi chúng ta tìm hiểu lớp CustomPagerAdapter, hãy cùng xem qua lớp ModelObject được định nghĩa trong tệp ModelObject.java.

package com.journaldev.viewpager;

public enum ModelObject {

    RED(R.string.red, R.layout.view_red),
    BLUE(R.string.blue, R.layout.view_blue),
    GREEN(R.string.green, R.layout.view_green);

    private int mTitleResId;
    private int mLayoutResId;

    ModelObject(int titleResId, int layoutResId) {
        mTitleResId = titleResId;
        mLayoutResId = layoutResId;
    }

    public int getTitleResId() {
        return mTitleResId;
    }

    public int getLayoutResId() {
        return mLayoutResId;
    }

}

Enum ở trên liệt kê tất cả các trang của ViewPager. Có tổng cộng ba trang, mỗi trang tương ứng với một layout riêng.

Dưới đây là layout của một trang đơn view_blue.xml :

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second View"
        android:layout_gravity="center_horizontal"
        android:textSize="28sp"
        android:textColor="@android:color/black"
        android:textStyle="bold"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/textView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Swipe left to\\nFirst View"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:textColor="@android:color/black"
        android:textStyle="bold"
        android:minLines="2"
        android:id="@+id/textView2"
        android:padding="@dimen/activity_horizontal_margin"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Swipe right to\\nThird View"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:textColor="@android:color/black"
        android:textStyle="bold"
        android:padding="@dimen/activity_horizontal_margin"
        android:minLines="2"
        android:id="@+id/textView3"
        android:layout_alignTop="@+id/textView2"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

Hai trang còn lại có bố cục tương tự và đều được định nghĩa trong phần mã nguồn của dự án này CustomPagerAdapter.java.

package com.journaldev.viewpager;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class CustomPagerAdapter extends PagerAdapter {

    private Context mContext;

    public CustomPagerAdapter(Context context) {
        mContext = context;
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        ModelObject modelObject = ModelObject.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getLayoutResId(), collection, false);
        collection.addView(layout);
        return layout;
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        collection.removeView((View) view);
    }

    @Override
    public int getCount() {
        return ModelObject.values().length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        ModelObject customPagerEnum = ModelObject.values()[position];
        return mContext.getString(customPagerEnum.getTitleResId());
    }

}

CustomPagerAdapter(Context context): Constructor (hàm khởi tạo) này cần một tham chiếu đến Context. Context này được lưu dưới dạng biến thành viên của lớp, vì nó sẽ được sử dụng sau đó để truy cập vào các layout của từng trang, được định nghĩa trong lớp enum.

instantiateItem: Trong trường hợp này, chúng ta sử dụng enum và “inflate” (nạp) layout tương ứng với giá trị enum đó. Sau đó, layout vừa được nạp sẽ được thêm vào ViewGroup (tập hợp các View) mà PagerAdapter quản lý, và cuối cùng chúng ta trả về layout đó. Đối tượng được trả về từ phương thức này cũng sẽ được dùng sau đó làm tham số thứ hai trong phương thức isViewFromObject.

destroyItem: Phương thức này dùng để loại bỏ một view cụ thể khỏi ViewGroup mà PagerAdapter đang quản lý.

getCount: Trả về số lượng view mà ViewPager sẽ quản lý. Trong ví dụ này, giá trị count chính là số giá trị enum có trong lớp ModelObject.

isViewFromObject: Phương thức này kiểm tra xem một đối tượng cụ thể có tương ứng với một vị trí nhất định trong ViewPager hay không. Tham số thứ hai là một đối tượng thuộc kiểu Object, và nó chính là đối tượng được trả về từ phương thức instantiateItem trước đó.

getPageTitle: Tại mỗi vị trí, PagerAdapter cần có một tiêu đề trang. Tiêu đề này thường hiển thị trên ActionBar của Activity hoặc được sử dụng trong các tab để gán nhãn cho từng tab. Trong trường hợp này, phương thức được sử dụng đơn giản để đặt tiêu đề cho từng trang.

Hình ảnh dưới đây cho thấy ứng dụng khi đang chạy.

ViewPager trong Android

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất