创建包含标签页的滑动视图
参考资料
安卓开发官方文档
IDE
- AndroidStudio
相关组件概述
布局管理器 (ViewPager2)
ViewPager2组件允许用户实现对展示数据向左右方向翻页。不过还需要一个适配器来生成若干页面以供滑动切换。它是ViewPager的替代组件。其具体特性与使用可以参考ViewPager2链接内容。
材料组件(Material Components for Android)
根据官方说明,Material是一个可适应的指导方针、组件和工具系统,支持用户界面设计的最佳实践。在开源代码的支持下,可以简化设计师和开发人员之间的写作,快速构建漂亮的产品。它提供了针对Web、Android、IOS和Flutter四种平台的材料组件。当前用到的是Material Components for Android。具体内容可以参考链接。
适配器(FragmentStateAdapter)
FragmentStateAdapter是FragmentStatePagerAdapter和FragmentPagerAdapter的替代,后两者在官方文档中被声明已弃用。该适配器的作用与FragmentStatePagerAdapter类似,即通过一个Fragment片段来管理每一个数据页面。该适配器的具体特性与使用可以参考链接内容。
视图控件(TabLayout)
TabLayout是一个水平方向的布局空间,用于显示选项卡
中间件(TabLayoutMediator)
TabLayoutMediator是连接TabLayout与ViewPager2的中介。当选项卡被选中时,中介将同步ViewPager2的位置与所选的选项卡,以及当用户拖动ViewPager2时同步TabLayout的滚动位置。其具体特性与使用可以参考链接内容。
声明依赖项
需要声明的依赖项有ViewPager2与材料组件两项。需要在build.gradle中做出引用声明,引用代码库具体的版本号可以在 Maven代码库 中搜索查看:
dependencies {
implementation 'com.google.android.material:material:1.2.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0
}
搭建滑动标签页代码框架
创建视图布局文件
需要在界面中加入一个TabLayout组件与一个ViewPager2组件。将二者进行适当布局调整
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/MyTabLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/MyViewPager"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/MyTabLayout" >
</androidx.viewpager2.widget.ViewPager2>
</androidx.constraintlayout.widget.ConstraintLayout>
此外,还需要创建一个Fragment(TabContentFragment)。用于处理与显示每一个Tab页面的内容。
构建适配器
需要创建一个自定义的适配器MyAdapter类,扩展自上面提到的FragmentStateAdapter类。在自定义类中重写父类的方法
- createFragment(返回一个TabContentFragment的实例)
- getItemCount(返回选项卡个数或者说tab页数)
下面的例子中,针对三个标签页的情况,适配器创建了3个页面片段实例,并在每一个实例中传入一个参数par。
public class MyAdapter extends FragmentStateAdapter {
public MyAdapter (@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public Fragment createFragment(int position) {
Fragment fragment=new TabContentFragment();
Bundle args=new Bundle();
String par="";
switch (position){
case 0:
par="0";
break;
case 1:
par="1";
break;
case 2:
par="2";
break;
default:
break;
}
args.putString(TabContentFragment.ARG_OBJECT,par);
fragment.setArguments(args);
return fragment;
}
@Override
public int getItemCount() {
return 3;
}
}
组装模块实现功能
在Activity控制器中,可以通过上面提到的中间件TabLayoutMediator对象将视图与ViewPager2组件结合,以实现标签页的滑动翻页功能。
在此之前,可以创建一个配置选项卡的类TabConfig,用于设置选项卡的信息。在使用中间件的时候会用到。
public class TabConfig implements TabLayoutMediator.TabConfigurationStrategy {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
//设置选项卡的标题
switch (position)
{
case 0:
tab.setText("选项卡1");
break;
case 1:
tab.setText("选项卡2");
break;
case 2:
tab.setText("选项卡3");
break;
}
}
}
接下来完成功能对接:
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
MyAdatper myadapter=new MyAdatper(this);
TabLayout tabLayout=(TabLayout)findViewById(R.id.MyTabLayout);
//可以添加一些标签页事件逻辑代码
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
ViewPager2 viewPager2=(ViewPager2)findViewById(R.id.MyViewPager);
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
}
});
viewPager2.setAdapter(myadapter);
TabConfig tabConfig=new TabConfig();
TabLayoutMediator tabLayoutMediator=new TabLayoutMediator(tabLayout,viewPager2,tabConfig);
tabLayoutMediator.attach();
}
}
到此,工作还并没有结束。只是实现了滑动翻页。但是每一个Tab页面的内容展示工作还没有做。这属于上面提到的TabContentFragment的任务。在TabContentFragment的代码中,可以获取适配器中传入的参数par。并根据需求,在适当的生命周期方法中,使用这些参数,或者编写一些自定义的逻辑,进行数据处理与展示
public class TabContentFragment extends Fragment {
public static final String ARG_OBJECT="object";
private Bundle args;
public TabContentFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_tab_content, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
public void onResume() {
//加载列表
super.onResume();
args = getArguments();
String par = args.getString(ARG_OBJECT)//获取适配器传入的参数
//一些其他逻辑代码
}
}
通过以上工作,应该就可以实现具有基本功能的可滑动翻页的标签页功能界面。