Android导航组件--创建包含标签页的滑动视图

参考资料

安卓开发官方文档

IDE

  • AndroidStudio

相关组件概述

布局管理器 (ViewPager2)

ViewPager2组件允许用户实现对展示数据向左右方向翻页。不过还需要一个适配器来生成若干页面以供滑动切换。它是ViewPager的替代组件。其具体特性与使用可以参考ViewPager2链接内容。

材料组件(Material Components for Android)

根据官方说明,Material是一个可适应的指导方针、组件和工具系统,支持用户界面设计的最佳实践。在开源代码的支持下,可以简化设计师和开发人员之间的写作,快速构建漂亮的产品。它提供了针对Web、Android、IOS和Flutter四种平台的材料组件。当前用到的是Material Components for Android。具体内容可以参考链接。

适配器(FragmentStateAdapter)

FragmentStateAdapterFragmentStatePagerAdapterFragmentPagerAdapter的替代,后两者在官方文档中被声明已弃用。该适配器的作用与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)//获取适配器传入的参数
		//一些其他逻辑代码
    }
}

通过以上工作,应该就可以实现具有基本功能的可滑动翻页的标签页功能界面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值