TabLayout ViewPager2 Fragment实现顶部切换布局 并且设置顶部tab点击效果

在build.gradle中配置文件

  implementation 'androidx.viewpager2:viewpager2:1.0.0'
  implementation "com.google.android.material:material:1.1.0"

在xml文件中配置com.google.android.material.tabs.TabLayoutandroidx.viewpager2.widget.ViewPager2的标签

<com.google.android.material.tabs.TabLayout
       android:id="@+id/tab_layout"
       android:layout_height="wrap_content"
       android:layout_width="match_parent"/>
   <androidx.viewpager2.widget.ViewPager2
       android:id="@+id/viewpager2"
       android:layout_height="match_parent"
       android:layout_width="match_parent"
       android:layout_below="@id/tab_layout"
       android:orientation="horizontal"
       />

在activity中
先声明 ViewPager2 TabLayout TabLayoutMediator
其中TabLayoutMediator是tablayout+viewpager2的联动工具类 重写onConfigureTab()方法可以设置顶部Tablayout的textview(注意:最好一定要使用attach()方法)
ViewPager2如果要fragment复用 不可以只new一个fragment(因为fragment有其特有生命周期 当共用一个时 切换页面的时候要先隐藏再显示 而共用的原因会都隐藏导致出错) 所以哪怕复用也是要声明多个fragment


public class MainActivity extends AppCompatActivity {
    private ViewPager2 viewPager2;
    private TabLayout tabLayout;
    private TabLayoutMediator mediator;

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

        final String[] tabs = {"推荐", "关注"};
        Fragment[] fragments = new Fragment[tabs.length];
        fragments[0] = new FeedMainFragment();
        fragments[1] = new FeedMainFragment();
        viewPager2 = findViewById(R.id.viewpager2);
        tabLayout = findViewById(R.id.tab_layout);
    
        viewPager2.setAdapter(new FragmentStateAdapter(getSupportFragmentManager(), getLifecycle()) {

            @NonNull
            @Override
            public Fragment createFragment(int position) {
			// 各分页的fragment
                return fragments[position];
            }

            @Override
            public int getItemCount() {
            // 有多少个分页
                return tabs.length;
            }
        });
    


        mediator = new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                TextView textView = new TextView(MainActivity.this);
                textView.setText(tabs[position]);
                tab.setCustomView(textView);

            }
        });
        mediator.attach();

    }
}

最后如果想设置顶部Tablayout 点击的模块字体放大变色等功能
需要做如下声明 并重写onPageSelected方法 在该方法内设置效果

private ViewPager2.OnPageChangeCallback changeCallback = new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageSelected(int position) {
            //可以来设置选中时tab的大小
            int tabCount = tabLayout.getTabCount();
            for (int i = 0; i < tabCount; i++) {
                TabLayout.Tab tab = tabLayout.getTabAt(i);
                TextView tabView = (TextView) tab.getCustomView();
                if (tab.getPosition() == position) {
                    tabView.setTextSize(20);
                    tabView.setTypeface(Typeface.DEFAULT_BOLD);
                } else {
                    tabView.setTextSize(15);
                    tabView.setTypeface(Typeface.DEFAULT);
                }
            }
        }
    };

然后在activity的onCreate()方法中设置页面切换监听

// 页面切换监听
viewPager2.registerOnPageChangeCallback(changeCallback);

效果图:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值