Android ViewPager 上下切换

在 Android 中,ViewPager 是一个常用的控件,可以实现页面之间的左右滑动切换,非常适合用于实现引导页、图片浏览、轮播图等功能。那么,在某些场景下,我们可能需要实现上下切换的效果,本文将介绍如何使用 ViewPager 实现上下切换的效果,并提供相应的代码示例。

ViewPager 简介

ViewPager 是 Android 支持库中的一个控件,用于实现页面之间的滑动切换。它可以承载多个子视图,并通过滑动手势进行页面的切换。ViewPager 使用 Adapter 来提供页面视图,每个页面都由一个 Fragment 表示。

实现上下切换的步骤

步骤一:添加支持库依赖

首先,在你的项目中添加 ViewPager 的支持库依赖。在 app 模块的 build.gradle 文件中的 dependencies 块中添加以下代码:

implementation 'androidx.viewpager2:viewpager2:1.0.0'

步骤二:布局文件中添加 ViewPager

在你的布局文件中添加 ViewPager 控件,并设置其 id 以便后续操作。

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

步骤三:创建 Fragment

创建两个 Fragment,分别表示上下两个页面。在你的项目中创建两个 Fragment 类,并实现相应的布局文件。

public class TopFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_top, container, false);
    }
}

public class BottomFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_bottom, container, false);
    }
}

步骤四:创建 FragmentStateAdapter

创建一个 FragmentStateAdapter 类,用于为 ViewPager 提供页面视图。

public class MyPagerAdapter extends FragmentStateAdapter {
    private static final int NUM_PAGES = 2;

    public MyPagerAdapter(@NonNull FragmentManager fragmentManager,
                          @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        if (position == 0) {
            return new TopFragment();
        } else {
            return new BottomFragment();
        }
    }

    @Override
    public int getItemCount() {
        return NUM_PAGES;
    }
}

步骤五:初始化 ViewPager

在 Activity 或 Fragment 中找到 ViewPager 控件,并为其创建适配器。

ViewPager2 viewPager = findViewById(R.id.viewPager);
viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(),
        getLifecycle()));

步骤六:实现上下切换

为了实现上下切换的效果,我们需要修改 ViewPager 的滑动方向。在 Activity 或 Fragment 的 onCreate 方法中添加以下代码:

viewPager.setOrientation(ViewPager2.ORIENTATION_VERTICAL);

完整示例代码

下面是一个完整的示例代码,演示了如何使用 ViewPager 实现上下切换的效果。

public class MainActivity extends AppCompatActivity {
    private static final int NUM_PAGES = 2;

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

        ViewPager2 viewPager = findViewById(R.id.viewPager);
        viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(),
                getLifecycle()));
        viewPager.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
    }

    public static class TopFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_top, container, false);
        }
    }

    public static class BottomFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_bottom, container, false);
        }
    }

    public static class MyPagerAdapter extends FragmentStateAdapter {
        public MyPagerAdapter(@NonNull FragmentManager fragmentManager,
                              @NonNull Lifecycle lifecycle) {
            super(fragmentManager, lifecycle);
        }

        @NonNull
        @Override
        public Fragment createFragment(int position) {
            if (position == 0) {
                return new TopFragment();
            } else {
                return new BottomFragment();
            }
        }

        @Override
        public int getItemCount() {
            return NUM_PAGES;
        }
    }
}